如何从 GAE 上传文件到 S3(一个恐怖故事)
Posted
技术标签:
【中文标题】如何从 GAE 上传文件到 S3(一个恐怖故事)【英文标题】:How to upload file to S3 from GAE (a horror story) 【发布时间】:2012-01-19 16:16:00 【问题描述】:我正在尝试从 GAE 将文件上传到亚马逊 S3。
我尝试了官方的 amazon sdk(jetS3t,建立在 lower-level sdk 之上),只是为了发现即使您可以通过在本地 JVM 上设置权限来使其在本地工作,它也不支持部署后与 GAE 加密相关的原因。
然后出于绝望,我找到了一些好灵魂forked the official low-level amazon sdk,以便它可以与GAE一起使用。这种工作(即使我可以看到一些奇怪的 NullPointer 异常被抛出)并且文件被上传......但如果文件大小超过 5MB,我会从 API 中收到错误:
com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call urlfetch.Fetch() was too large
我不完全理解这一点,因为当前的 GAE 限制似乎是 32MB 的文件大小上传和 1MB 的请求/响应,而我的问题仅在文件大约 5MB 或更大时出现。
我认为我剩下的唯一选择是 jclouds,但我无法找到使用 BlobStore 库将文件上传到 S3 的示例。
有没有人可以分享使用 jClouds 上传 S3 文件的经验/示例?我是否可能会发生同样的情况 urlfetch.Fetch() was too large
错误?
任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:URLFetch 请求限制为 5MB,如 here 所述。唯一可行的解决方案是将大的有效载荷分解成更小的块。幸运的是,S3 提供了multipart upload API。
【讨论】:
谢谢尼克 - 让我们看看我能否让分段上传 API 与 app-engine 很好地配合 :) @JohnIdol 您是否考虑过自己编写代码? RESTful API 非常简单 - 唯一的复杂性是计算标头签名,并且可能有一个库可以为您完成。 我将其保留在所有其他失败的情况下 :) 现在我使用“低级”aws API 方法再试一次(“高级”方法在各种情况下都失败了'访问被拒绝'问题)。【参考方案2】:在release notes for 1.5.0 上,我读到为了响应大众的需求,HTTP 请求和响应的大小已增加到 32 MB。 所以,请求和响应,没有提到 URL 获取。
确实,查看URL Fetch documentation,它说它最大为 5 Mb。
【讨论】:
以上是关于如何从 GAE 上传文件到 S3(一个恐怖故事)的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 SDK 的情况下将文件从 Android 上传到 Amazon S3
Google App Engine 和 Amazon S3 文件上传