`
fosa0989
  • 浏览: 110221 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Google App Engine 文件上传的代码

阅读更多

以前写的Google App Engine上传程序,贴出来上传这部分代码给大家分享下。
不知道现在Google还有没有限制,我以前测试的能上传10M左右。否则就会超时错误。

1. 上传的代码

 

 

    public void  uploadAction(HttpServletRequest req, Page p)
		throws IOException, ServletException {    	
		String path = getHomeUrl(req);
		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
		long id = -1;
		if (isMultipart) {
			ServletFileUpload uploader = new ServletFileUpload();
			uploader.setFileSizeMax(MAX_FILE_SIZE);
			
			try {
				FileItemIterator it = uploader.getItemIterator(req);
				DataFile df = new DataFile();
				df.setDownloadTimes(0);
				
				while (it.hasNext()) {
					FileItemStream item = it.next();

					if(item.isFormField()){
						String value = readString(item.openStream());						
						if(item.getFieldName().equals("categoryId"))
							df.setCategoryId(Integer.valueOf(value));
						else if(item.getFieldName().equals("title"))
							df.setTitle(value);
						else if(item.getFieldName().equals("description"))
							df.setDescription(new Text(value));
					}else{					
						String filename = getFileName(item.getName());
						if(isBlank(filename))
							break;
						
						df.setFilename(filename);
						df.setContentType(ContentType.fetchMatchContentType(filename));
						df.setPostDate(new Date(System.currentTimeMillis()));
						service.add(df);												
						id = df.getId();
						saveFile(item.openStream(), df);
						service.update(df);
					}
				}
								
				if(df.getId() != null){
					String url = path+ "/" + df.getId() + "/show.html";
	    			FileCategory cat = catService.get(df.getCategoryId());
	    			p.put("category", cat == null?"":cat.getName());	    			
					p.put("durl", getHomeUrl(req)+"/file/"+df.getId()+"_"+df.getFilename());    			
					p.put("url", url);
					p.put("file", df);
					p.put("message", "文件上传成功!");
					p.setTemplate("filedata_show.ftl");
				}else{
					p.put("message", "文件上传失败!");
					uploadformAction(req, p);			
				}
			} 
			catch (Exception e) {
				e.printStackTrace();
				p.put("message", "文件上传失败!文件大小不能超过10M!");
				if(id>-1){
					service.delete(id);
					blockService.deleteBlocksOfFile(id);				
				}
				uploadformAction(req, p);			
			}
		}    	
    }
    
	private void saveFile(InputStream in, DataFile df) throws IOException{
		int len, size = 0, totalSize = 0;
		int sn = 1;
		if(in.available() > MAX_FILE_SIZE){
			System.out.println("file to big!");
			throw new IOException("Too Large");		
		}
		while ((len = in.read(buffer)) != -1) {
			if((size + len) > Block_SIZE){//save this block
				DataBlock block = new DataBlock();
				block.setSize(size);
				block.setFileId(df.getId());
				block.setSn(sn++);
				
				byte[] byt = Arrays.copyOf(data, size);
				Blob bo = new Blob(byt);
				block.setData(bo);
				blockService.add(block);
				size = 0;
			}
			
			System.arraycopy(buffer, 0, data, size, len);
			size += len;
			totalSize += len;
		}
		
		if(size > 0){
			DataBlock block = new DataBlock();
			block.setSize(size);
			block.setFileId(df.getId());
			block.setSn(sn++);
			
			byte[] byt = Arrays.copyOf(data, size);
			Blob bo = new Blob(byt);
			block.setData(bo);
			blockService.add(block);			
		}
		
		df.setSize(totalSize);
		in.close();
	}
 

 

2. 下载的代码

 

	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {		
		HttpSession session = req.getSession();
		String seStr = (String)session.getAttribute(Constants.VERIFY_CODE);
		String inputStr = req.getParameter("verify_code");
		
		if(inputStr != null && inputStr.equals(seStr)){
			String url = req.getRequestURI();
			int ind = url.lastIndexOf("/");
			if(ind == -1)
				return;
			
			String temp[] = url.split("/");
			String filename = temp[temp.length - 1];
			ind = filename.indexOf("_");
			String id = filename.substring(0, ind);
			filename = filename.substring(ind + 1);
			
			if(id != null){			
				DataFile df = fservice.get(Long.valueOf(id), false);
				if(df != null){
					resp.setContentType(df.getContentType());
					ServletOutputStream os = resp.getOutputStream();					
					List<DataBlock> dbs = service.blocksOfFile(Long.valueOf(id));
					for(DataBlock db : dbs)
						os.write(db.getData().getBytes());
				
					fservice.updateDownloadTimes(Long.valueOf(id));
				}else{
			        Page page = new Page();
			        page.put("home", getHomeUrl(req));
			        page.put("message", "要下载的文件不存在!");
	    			page.setTemplate("filedata_error.ftl");
	    	        Template t = cfg.getTemplate(page.getTemplate());
	                
	    	        Writer out = new BufferedWriter(
	    	        		new OutputStreamWriter(
	    	        				resp.getOutputStream(), t.getEncoding()));
	    	        resp.setContentType("text/html; charset=" + t.getEncoding());
	    	        resp.setHeader("Cache-Control", "no-cache");
	    	        resp.setHeader("Pragma", "no-cache");
	    	        resp.setHeader("Expires", "Thu, 01 Dec 2010 00:00:00 GMT");
	    	            
	    	        try {
	    	        	t.process(page.getRoot(), out);
	    	        	out.flush();
	    	        } catch (TemplateException e) {
	    	        	e.printStackTrace();
	    	        	resp.sendRedirect("error.htm");
	    	        }	    			
				}
			}			
		}else{
			doGet(req, resp);
		}
						
	}

 3. 和freemarker集成的Controller

 

import java.io.*;
import java.lang.reflect.Method;

import javax.servlet.*;
import javax.servlet.http.*;

import com.hchen.pubshare.service.FileCategoryService;
import com.hchen.pubshare.service.impl.FileCategoryServiceImpl;
import com.hchen.pubshare.util.Page;

import freemarker.template.*;

public abstract class ControllerServlet extends HttpServlet {
	private static final long serialVersionUID = -754687385885208233L;
	private Configuration cfg; 
	private FileCategoryService catService = new FileCategoryServiceImpl();
	
    public void init() {
        cfg = new Configuration();
        cfg.setServletContextForTemplateLoading(
                getServletContext(), "WEB-INF/templates");
        // - Set update dealy to 0 for now, to ease debugging and testing
        cfg.setTemplateUpdateDelay(0);
        // - Set error handler for debugging HTML templates
//        cfg.setTemplateExceptionHandler(
//                TemplateExceptionHandler.HTML_DEBUG_HANDLER);
        // - Use beans wrapper
        cfg.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);
        // - Set default charset
        cfg.setDefaultEncoding("UTF-8");
        cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
        cfg.setNumberFormat("############");
    }
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    	try{
    		String action = req.getServletPath();
    		if (action == null) action = "index";
    		if (action.lastIndexOf("/") != -1) action = action.substring(action.lastIndexOf("/") + 1);
    		if (action.lastIndexOf(".") != -1) action = action.substring(0, action.lastIndexOf("."));

    		Method actionMethod = getClass().getMethod(action + "Action",
        						new Class[]{HttpServletRequest.class, Page.class});
    		Page page = new Page();
    		page.put("message", "");
    		page.put("home", getHomeUrl(req));
    		processRequestParameters(req.getServletPath(), action, page);
    		actionMethod.invoke(this, new Object[]{req, page});
        
    		if (page.getTemplate() != null) { // show a page with a template
    			Template t = cfg.getTemplate(page.getTemplate());
    			Writer out = new BufferedWriter(
                    new OutputStreamWriter(
                            resp.getOutputStream(), t.getEncoding()));
    			resp.setContentType("text/html; charset=" + t.getEncoding());
    			resp.setHeader("Cache-Control", "no-cache");
    			resp.setHeader("Pragma", "no-cache");
    			resp.setHeader("Expires", "Thu, 01 Dec 2010 00:00:00 GMT");
            
                t.process(page.getRoot(), out);
                out.flush();
    		} else if (page.getForward() != null) { // forward request
    			if(page.isDispatch()){
    				RequestDispatcher rd = req.getRequestDispatcher(page.getForward());
    				rd.forward(req, resp);            
    			}else{
    				resp.sendRedirect(page.getForward());
    			}
    		} else { // Ops!
    			throw new ServletException("The action didn't specified command.");
    		}
    	}catch(Exception ex){
    		ex.printStackTrace();
    		resp.sendRedirect("error.htm");
    	}    	
    }
    
    public static String noNull(String s) {
        return s == null ? "" : s;
    }
    
    public static boolean isBlank(String s) {
        return s == null || s.trim().length() == 0; 
    }    
    
    public String getHomeUrl(HttpServletRequest req){
		String path = null;
		if (req.getServerPort() == 80 )
			path="http://"+req.getServerName();
		else 
			path="http://"+req.getServerName()+":"+req.getServerPort();    	
		
		return path;
    }
    
	public void processRequestParameters(String path, String action, Page page){
		if(isBlank(action))
			return;
		String temps[] = path.split("/");
		int len = temps.length;
		if(action.equals("show")){
			if(temps.length > 2) page.addReqParameter("id", temps[len - 2]);
		}else if(action.equals("list")){
			if(temps.length > 3){
				page.addReqParameter("dir", temps[len - 3]);
				page.addReqParameter("offset", temps[len - 2]);
			}
		}
	}
}

 

完整代码上传到 google code了,以前做的一个文件上传的Google App,现在不弄这个了。

 

svn checkout http://pubshare.googlecode.com/svn/trunk/ pubshare-read-only

分享到:
评论

相关推荐

    appengine-java-sdk-1.3.1 GoogleApp开发的SDK(Java版)

    标题中的"appengine-java-sdk-1.3.1"指的是Google App Engine的Java版本SDK,这是一个用于在Google云平台上开发和部署Java应用程序的工具包。这个SDK包含了运行和测试Google App Engine应用所需的所有组件,包括开发...

    Google App Engine

    - **托管服务**:Google App Engine负责应用的运行,开发者只需上传代码,无需关注服务器运维。 - **自动缩放**:根据应用流量自动调整资源,确保性能和成本平衡。 - **多种服务**:包括数据存储(如Datastore)...

    云端代码Google App Engine编程指南

    Java应用的配置文件是`appengine-web.xml`,用于定义应用属性和服务。 **三、Google App Engine的关键特性** 1. **数据存储:Cloud Datastore** App Engine的NoSQL数据库,提供强一致性读取和最终一致性写入。...

    上传 文件到Google app engine datastore的Demo

    本示例主要关注如何将文件上传到Google App Engine的数据存储(Datastore)。数据存储是GAE的一个核心组件,它是一个NoSQL的键值对数据库,用于存储应用程序的数据。 在"上传文件到Google app engine datastore的...

    google_appengine_1.9.50.zip

    这个"google_appengine_1.9.50.zip"压缩包包含了 Google App Engine 的 Python SDK,版本为1.9.50。 **Google App Engine 的主要特点:** 1. **自动缩放**:根据应用程序的需求,Google App Engine 可以自动调整...

    google app engine开发人员文档

    Google App Engine(GAE)是谷歌提供的一种云计算平台,它允许开发者构建并托管Web应用程序,无需管理和维护服务器硬件。这个平台支持多种编程语言,包括Python、Java、Go和PHP,为开发者提供了强大的服务,如数据...

    Google App Engine API 大全

    **Google App Engine (GAE) API 大全** Google App Engine 是一个托管平台,它允许开发者使用特定的API和框架来构建、部署和运行Web应用程序。这个平台支持多种编程语言,其中Java是其中之一。在本指南中,我们将...

    google app engine 教程

    ### Google App Engine 教程知识点总结 #### 一、Google App Engine 概览 - **定义**:Google App Engine (GAE) 是一种基于云端的平台即服务 (PaaS),允许开发者构建和托管应用程序,无需管理底层基础设施。GAE ...

    Google App Engine for Java快速入门指南v1.2.0

    AppEngine简介 **1.1 什么是Google App Engine?** Google App Engine (GAE) 是一款由Google提供的平台即服务(PaaS),允许开发者在其基础设施上部署Web应用程序。通过使用Google App Engine,开发者能够构建出...

    Google app engine plugins Eclipse Google 插件 3.3

    项目模板会自动包含必要的框架和配置文件,如 `appengine-web.xml` 和 `web.xml`。 3. **开发环境集成**:Eclipse 插件提供了一个内置的本地服务器,允许你在开发过程中实时预览和测试应用。你可以通过插件的调试...

    appengine-java-sdk-1.8.7.zip

    2. **创建项目**: 使用SDK创建一个新的App Engine项目,这将生成基本的项目结构,包括必需的配置文件如`appengine-web.xml`和`web.xml`。 3. **编写代码**: 开发者使用Java语言编写应用代码,可以使用SDK提供的API...

    分享:集成了Django1.0 的Google App Engine开发 模板项目

    5. **部署流程**:学习如何打包Django应用,创建和配置app.yaml文件,然后使用gcloud命令行工具将应用上传到App Engine。 6. **Django模型和App Engine数据存储**:Django的ORM需要与App Engine的Datastore进行适配...

    在Google App Engine上开发Flex应用(含简单示例源码)

    4. **部署服务器应用** - 将编译好的Python应用上传到Google App Engine,配置应用的app.yaml文件以定义服务和路由。 5. **配置Flex客户端** - 更新Flex客户端的配置文件,指定服务器的URL,以便于客户端能够正确地...

    离线 google app engine 文档

    2. **AppCfg 工具**:用于部署和管理应用程序,包括上传代码、设置版本和流量分发。 3. **App Engine SDK**:包含了开发所需的所有工具和库,如 Python 库、数据模型和 API 文档。 四、性能优化 1. **Request ...

    WingIDE部署GAE(google app engine)

    from google.appengine.ext.webapp.util import run_wsgi_app class HelloWorld(webapp.RequestHandler): def get(self): self.response.out.write('Hello, world!') application = webapp.WSGIApplication([('/...

    Developing with Google App Engine

    ### 使用Google App Engine进行开发的关键知识点 #### 一、Google App Engine简介 - **定义**:Google App Engine(简称GAE)是Google提供的一种云应用平台,允许开发者在其上构建和部署应用程序,无需担心底层基础...

    Google App Engine 开发人员指南.pdf

    ### Google App Engine 开发人员指南知识点详述 #### 一、概述 Google App Engine (GAE) 是由谷歌提供的一项云服务,允许开发者在其基础设施上部署网络应用。它旨在简化应用开发过程,使得开发者能够专注于编写高...

    云应用开发 ——Google App Engine & Google Web Toolkit入门指南

    - **FileUpload**:用于文件上传的控件。 - **DatePicker**:日期选择器。 - **ListBox**:下拉列表。 - **SuggestBox**:带有自动完成功能的输入框。 - **Tree**:树形控件。 - **MenuBar**:菜单栏。 - **...

    GoogleAppEngine-appengine-python-sdk-1.9.24

    此版本为GoogleAppEngine-appengine-python-sdk-1.9.24,发布于2015年7月28日。 **一、Python支持** Google App Engine SDK for Python提供了对Python 2.7版本的支持。Python是一种高级编程语言,以其简洁易读的...

Global site tag (gtag.js) - Google Analytics