将大于40MB的文件上传到Google App Engine?

Nic*_*oul 8 upload google-app-engine file-upload

我正在创建一个Google App Engine网络应用程序来"转换"10K~50M的文件

场景:

  1. 用户在Web浏览器中打开http://fixdeck.appspot.com
  2. 用户点击"浏览",选择文件,提交
  3. Servlet将文件加载为InputStream
  4. Servlet转换文件
  5. Servlet将文件保存为OutputStream
  6. 用户的浏览器接收转换后的文件并询问保存位置,直接作为对步骤2中请求的响应

(现在我没有实现第4步,servlet将文件发回而不进行转换.)

问题:它适用于15MB文件但不适用于40MB文件,说:"错误:请求实体太大.您的客户发出的请求太大了."

对此有任何解决方法吗?

源代码:https://github.com/nicolas-raoul/transdeck
原理:http://code.google.com/p/ankidroid/issues/detail id = 697

kal*_*ech 9

对于HTTP请求和HTTP响应,GAE的硬限制为32MB.这将直接限制上传/下载GAE应用程序的大小.

修订后的答案(使用Blobstore API.)

Google向Blobstore API提供了处理GAE中较大文件(最高2GB)的功能.概述文档提供了完整的示例代码.您的Web表单会将文件上传到blobstore.然后blobstore API将POST重写回您的servlet,您可以在其中进行转换并将转换后的数据保存回blobstore(作为新的blob).

原始答案(没有考虑Blobstore作为选项.)

对于下载,我认为GAE唯一的解决方法是将文件分解为服务器上的多个部分,然后在下载后重新组装.但是,使用直接浏览器实现可能并不可行.

(作为替代设计,也许您可​​以将转换后的文件从GAE发送到外部下载位置(例如S3),浏览器可以在没有GAE限制的情况下将其下载.我不相信GAE发起的连接有相同的请求/响应大小限制,但我不是正面的.无论如何,你仍然会受到30秒最大请求时间的限制.为了解决这个问题,你必须查看GAE后端实例并提出某种异步下载策略.)

为了上传更大的文件,我已经了解了使用HTML5文件API将文件切片到多个块进行上传,然后在服务器上重建的可能性.示例:http://www.html5rocks.com/en/tutorials/file/dndfiles/#toc-slicing-files.但是,由于规格和浏览器功能的变化,我认为解决方案并不实用.


Dre*_*ars 9

您可以使用blobstore上传大小为2千兆字节的文件.