将文件写入Blobstore

时间:2012-01-05 00:30:47

标签: google-app-engine httprequest blobstore

目标:假设客户端使用网络表单向服务器(Google App Engine)提交字符串或文本文件。我希望服务器修改原始文件并将其提供给客户端。

我认为从GAE提供文件的唯一方法是使用Blobstore,对吧?然后,由于我们无法修改blob,我相信解决方案将是:

  1. 客户端使用HttpRequest上传文件
  2. 服务器读取上传的文件并将其复制到临时缓冲区(不确定是否有方法可以执行此操作)
  3. 服务器删除原始blob
  4. 服务器修改临时缓冲区中的数据
  5. 服务器将修改后的缓冲区写入Blobstore
  6. 服务器将新blob提供给客户端
  7. 这会有用吗?你能考虑其他任何解决方案吗?

    由于

2 个答案:

答案 0 :(得分:5)

I think the only way to serve files from GAE is using the Blobstore, right?

错误。 '文件'只是一种在磁盘上存储数据的方式;没有什么可以从需要数据来自实际可写磁盘文件的网络服务器提供服务。您只需通过表单上传接受用户的数据,对其进行修改并将其提供给用户,而无需接触磁盘,blobstore或任何其他永久存储介质。

如果用户的数据太大而无法容纳在内存中,这只会成为问题,在这种情况下,您必须在处理数据时将数据存储在某处,例如在blobstore中。

答案 1 :(得分:2)

http://code.google.com/appengine/kb/java.html#fileforms

向您展示如何进行文件上传,这必须通过多部分表单数据执行。

对于非文件数据,您可以直接从请求流中读取。

您甚至不必存储文件/输入流。只需将处理后的数据吐出到输出响应流中,同时读取输入FileItemStream或请求输入流。

如果您的文件/输入处理需要前瞻,请确定前瞻的最大距离,并将该距离用作缓冲区大小。

进一步修改

要使用文件类型响应客户端,请设置响应内容类型或mime类型。 例如,我有动态生成gifs,jpgs,xls,cvs等的应用程序。

响应流源是您读取的文件还是动态生成的流没有任何区别。因为,即使您有一个存储文件需要作为响应发送到客户端,您仍然可能必须将其转换为响应流并适当标记内容类型。

对于动态生成的内容,除非您需要缓存输出,否则无需将文件生成到Web URL可见位置,然后生成带有该链接的新html页面,并将该html页面发送到浏览器。您不需要用户的浏览器只需刷新自己就可以获得该链接。

您只需直接使用响应流发送“文件”即可。您可以将GWT客户端设计为接受“文件”,可能在命名框架中,其中命名框架src url是执行文件动态生成的应用程序。

阅读http://en.wikipedia.org/wiki/Mime-type以找到您需要的内容类型。

如果目标客户端的浏览器没有为响应的内容类型设置内容处理程序,那么它将用于处理或被视为文件下载。

我经常使用jsp或jspx来生成动态生成的图表或电子表格。没有涉及的存储文件。在读取请求时写入响应。让我们看看jsp页面指令,设置内容类型以在CSV上调用MS Excel。

<%@ page language="java" contentType="application/vnd-ms-excel; charset=UTF-8"
    pageEncoding="UTF-8"%>

对于servlet,ServletResponse.setContentType(String)

是设置内容类型的方法。