- 浏览: 110221 次
- 性别:
- 来自: 北京
最新评论
-
ocean1999:
有代码没 想学习哈 邮箱65614435@qq.com ,非常 ...
使用Google app做了个文件上传网站 http://avatar-share.appspot.com -
mywayscut:
很不错。详细介绍下吧,上传到blob的实现的怎么样的
使用Google app做了个文件上传网站 http://avatar-share.appspot.com
以前写的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
发表评论
-
访问需要HTTP Basic Authentication认证的资源的各种语言的实现
2011-12-02 12:23 1748无聊想调用下嘀咕的api的时候,发现需要HTTP Bas ... -
设计一个不用OAuth的安全的REST接口
2011-12-02 12:09 2024You want to develop a RESTfu ... -
wordpress 内网外网访问问题
2011-04-08 01:29 4991在实验室的服务器上部署了wordpress,发现在外网访问正常 ... -
使用Google app做了个文件上传网站 http://avatar-share.appspot.com
2010-02-24 12:20 1476使用google app engine开发了一个文件分享网站, ... -
nginx + mongrel 配置文件
2009-12-04 16:25 10051 nginx 配置文件 user hchen; work ... -
GAE paging
2009-11-19 14:51 781Hi all! There's been a lot of g ... -
GAE with spring实践经验
2009-11-16 09:59 912最近看到很多人研究GAE,这周末我也花了两天时间用GAE + ... -
struts2多文件上传
2009-05-14 10:53 1037import java.io.File; import ja ... -
使用XDoclet反向生成hibernate映射文件和DDL
2009-05-04 17:16 18471 在编写vo文件时候在类和字段的注释上添加xdoclet使用 ... -
hibernate many-to-many实例
2009-04-24 16:08 2687该实例有两个对象User和Group,User和Group建立 ... -
使用自定义拦截器加载字典表
2009-04-22 17:20 1464使用自定义拦截器可以直接实现接口com.opensymphon ... -
Javascript动态添加,删除表格行的例子
2009-04-18 00:00 1410最近又开始做Web项目,完全又成新手了,几年前就没仔细看过Ja ... -
Struts2 validate
2009-04-17 16:13 1960如何让Validate验证只验证指定的方法? 比如update ...
相关推荐
标题中的"appengine-java-sdk-1.3.1"指的是Google App Engine的Java版本SDK,这是一个用于在Google云平台上开发和部署Java应用程序的工具包。这个SDK包含了运行和测试Google App Engine应用所需的所有组件,包括开发...
- **托管服务**:Google App Engine负责应用的运行,开发者只需上传代码,无需关注服务器运维。 - **自动缩放**:根据应用流量自动调整资源,确保性能和成本平衡。 - **多种服务**:包括数据存储(如Datastore)...
Java应用的配置文件是`appengine-web.xml`,用于定义应用属性和服务。 **三、Google App Engine的关键特性** 1. **数据存储:Cloud Datastore** App Engine的NoSQL数据库,提供强一致性读取和最终一致性写入。...
本示例主要关注如何将文件上传到Google App Engine的数据存储(Datastore)。数据存储是GAE的一个核心组件,它是一个NoSQL的键值对数据库,用于存储应用程序的数据。 在"上传文件到Google app engine datastore的...
这个"google_appengine_1.9.50.zip"压缩包包含了 Google App Engine 的 Python SDK,版本为1.9.50。 **Google App Engine 的主要特点:** 1. **自动缩放**:根据应用程序的需求,Google App Engine 可以自动调整...
Google App Engine(GAE)是谷歌提供的一种云计算平台,它允许开发者构建并托管Web应用程序,无需管理和维护服务器硬件。这个平台支持多种编程语言,包括Python、Java、Go和PHP,为开发者提供了强大的服务,如数据...
**Google App Engine (GAE) API 大全** Google App Engine 是一个托管平台,它允许开发者使用特定的API和框架来构建、部署和运行Web应用程序。这个平台支持多种编程语言,其中Java是其中之一。在本指南中,我们将...
### Google App Engine 教程知识点总结 #### 一、Google App Engine 概览 - **定义**:Google App Engine (GAE) 是一种基于云端的平台即服务 (PaaS),允许开发者构建和托管应用程序,无需管理底层基础设施。GAE ...
AppEngine简介 **1.1 什么是Google App Engine?** Google App Engine (GAE) 是一款由Google提供的平台即服务(PaaS),允许开发者在其基础设施上部署Web应用程序。通过使用Google App Engine,开发者能够构建出...
项目模板会自动包含必要的框架和配置文件,如 `appengine-web.xml` 和 `web.xml`。 3. **开发环境集成**:Eclipse 插件提供了一个内置的本地服务器,允许你在开发过程中实时预览和测试应用。你可以通过插件的调试...
2. **创建项目**: 使用SDK创建一个新的App Engine项目,这将生成基本的项目结构,包括必需的配置文件如`appengine-web.xml`和`web.xml`。 3. **编写代码**: 开发者使用Java语言编写应用代码,可以使用SDK提供的API...
5. **部署流程**:学习如何打包Django应用,创建和配置app.yaml文件,然后使用gcloud命令行工具将应用上传到App Engine。 6. **Django模型和App Engine数据存储**:Django的ORM需要与App Engine的Datastore进行适配...
4. **部署服务器应用** - 将编译好的Python应用上传到Google App Engine,配置应用的app.yaml文件以定义服务和路由。 5. **配置Flex客户端** - 更新Flex客户端的配置文件,指定服务器的URL,以便于客户端能够正确地...
2. **AppCfg 工具**:用于部署和管理应用程序,包括上传代码、设置版本和流量分发。 3. **App Engine SDK**:包含了开发所需的所有工具和库,如 Python 库、数据模型和 API 文档。 四、性能优化 1. **Request ...
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([('/...
### 使用Google App Engine进行开发的关键知识点 #### 一、Google App Engine简介 - **定义**:Google App Engine(简称GAE)是Google提供的一种云应用平台,允许开发者在其上构建和部署应用程序,无需担心底层基础...
### Google App Engine 开发人员指南知识点详述 #### 一、概述 Google App Engine (GAE) 是由谷歌提供的一项云服务,允许开发者在其基础设施上部署网络应用。它旨在简化应用开发过程,使得开发者能够专注于编写高...
- **FileUpload**:用于文件上传的控件。 - **DatePicker**:日期选择器。 - **ListBox**:下拉列表。 - **SuggestBox**:带有自动完成功能的输入框。 - **Tree**:树形控件。 - **MenuBar**:菜单栏。 - **...
此版本为GoogleAppEngine-appengine-python-sdk-1.9.24,发布于2015年7月28日。 **一、Python支持** Google App Engine SDK for Python提供了对Python 2.7版本的支持。Python是一种高级编程语言,以其简洁易读的...