Google App Engine 大文件上传

Posted

技术标签:

【中文标题】Google App Engine 大文件上传【英文标题】:Google App Engine Large File Upload 【发布时间】:2010-10-24 22:53:00 【问题描述】:

我正在尝试将数据上传到 Google App Engine(使用 GWT)。我正在使用 FileUploader 小部件,servlet 使用 InputStream 读取数据并直接插入数据存储区。在本地运行它,我可以成功上传大文件,但是当我将它部署到 GAE 时,我受到 30 秒请求时间的限制。有没有办法解决?或者有什么方法可以将文件分成更小的块并发送更小的块?

【问题讨论】:

【参考方案1】:

30 秒响应时间限制仅适用于代码执行。因此,将实际文件作为请求正文的一部分上传不包括在内。仅当客户端将请求完全发送到服务器并且您的代码开始处理提交的请求时,计时器才会启动。因此,客户端的连接速度有多慢并不重要。

Uploading file on Google App Engine using Datastore and 30 sec response time limitation

【讨论】:

【参考方案2】:

通过使用BlobStore,您有一个1 GB size limit 和一个special handler, called unsurprisingly BlobstoreUpload Handler,不会在上传时出现超时问题。

还可以查看http://demofileuploadgae.appspot.com/(sourcecode、source answer),它完全符合您的要求。

另外,请查看GWT-Examples 的其余部分。

【讨论】:

【参考方案3】:

如果您的请求已用完请求时间,您无能为力。也许你的文件太大了,你需要在客户端对它们进行分块(使用 Flash 或 Java 之类的东西或pupload 之类的上传框架)。

一旦您将文件发送到应用程序,就会出现另一个问题 - 数据存储限制。在这里你有两个选择:

您可以使用 BlobStore 服务,该服务具有非常好的 API 来处理 50 兆字节的大型上传

您可以使用 bigblobae 之类的东西,它可以在常规 appengine 数据存储区中存储几乎无限大小的 blob。

【讨论】:

【参考方案4】:

我同意将数据分块到更小的 Blob 并有两个表,一个包含元数据(文件名、大小、下载次数等),另一个包含块,这些块通过 a 与元数据表相关联外键,我觉得可行...

或者,当您上传所有块时,您可以简单地将它们放在一个具有一张表的 blob 中。

但问题是,您将需要一个胖客户端来提供分块数据,例如 Java Applet,需要您的客户端对其进行签名和信任,以便它可以访问本地文件系统

【讨论】:

【参考方案5】:

您可以得到的最接近的方法是在将其存储在 GAE 中时将其拆分为多个块,然后在下载时通过发出单独的 AJAX 请求将其拼凑在一起。

【讨论】:

【参考方案6】:

目前,GAE 对文件上传(和响应大小)施加了 10 MB 的限制,并对许多其他内容施加了 1 MB 的限制;因此,即使您的网络连接速度足够快,可以在 30 秒的窗口内增加 10 MB 以上的数据,那也无济于事。谷歌已经说过(我昨天在 Pycon Italia Tre 上听到 Guido van Rossum 提到)它计划在未来克服这些限制(至少对于按使用付费超过配额的 GAE 用户来说——不确定是否计划扩展到不付费的 GAE 用户,通常需要接受较小的配额才能免费使用 GAE。

【讨论】:

googleappengine.blogspot.com/2010/12/…【参考方案7】:

您需要上传到另一台服务器 - 我相信 30 秒超时无法解决。如果有办法,请指正!我很想知道怎么做!

【讨论】:

这就是我害怕的。我想这还不错……我可以使用 Amazon S3 进行存储。我想这会简化存储部分,但把所有东西都放在同一个地方还是不错的。

以上是关于Google App Engine 大文件上传的主要内容,如果未能解决你的问题,请参考以下文章

将大型视频文件上传到 Google App Engine

GWT与Google App Engine-上传文件

Google App Engine 和 Amazon S3 文件上传

上传属性 Google App Engine - app.yaml

将 App Engine Blobkey 解码为 Google Cloud Storage 文件名

与 Google App Engine 一起上传图片