2012-01-05 50 views
1

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

我认为从GAE提供文件的唯一方法是使用Blobstore,对吧?然后,当我们不能改变的斑点,我认为一个解决办法是:

  1. 客户端上传使用文件的HttpRequest
  2. 服务器读取上传的文件,并将其复制到一个临时缓冲区(不知道有没有一种方法要做到这一点)
  3. Server删除原来的blob
  4. 服务器在临时缓冲区
  5. 服务器写入修改后的缓冲至Blobstore
  6. 服务器修改数据提供了新斑块给客户

这项工作?你可以考虑其他解决方案吗?

感谢

+0

顺便说一句,这个问题没有关于GWT,你应该删除GWT标记。除非你也想问如何在GWT中执行多部分。 – 2012-01-05 02:15:15

回答

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

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

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

+0

谢谢尼克!问题是我需要为TXT文件提供已处理的数据。有没有办法在服务器端(GAE)创建该文件,还是应该为客户端提供数据流并在客户端使用此数据创建TXT文件? – Arturo 2012-01-05 08:51:23

+4

@ user411103根本不需要创建文件 - 只需向用户发送文本数据即可。如果你希望他们把它作为下载而不是在他们的浏览器中,你需要考虑设置Content-Disposition标题(Google的内容处置附件)。 – 2012-01-05 09:53:07

+0

谢谢,那正是我需要知道的。 – Arturo 2012-01-05 17:07:40

2

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

告诉您如何做到这一点的文件上传,其中有被救援人员到场多形式的数据进行的。

与非文件数据类似,您可以直接从请求流中读取数据。

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

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

进一步修改

为了响应客户端与文件类型,设置响应内容类型或MIME类型。 例如,我已经有动态生成gif,jpgs,xls,cvs等的应用程序。

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

对于动态生成的内容,除非需要缓存输出,否则不需要将该文件生成到网页可见位置,然后使用该链接生成新的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)

是方法来设置内容类型。

+0

谢谢!现在,我很清楚如何上传原始文件...但我需要向用户提供一个带有处理数据的新txt文件,并且我无法在GAE的服务器端找到创建该文件的方法。 应该在这种情况下提供输出响应流并在客户端使用此数据创建文件? – Arturo 2012-01-05 08:47:38