支持恢复将大文件上传到 S3

Posted

技术标签:

【中文标题】支持恢复将大文件上传到 S3【英文标题】:Upload large files to S3 with resume support 【发布时间】:2012-04-24 20:53:31 【问题描述】:

(我是 Amazon AWS/S3 的新手,请多多包涵)

我的最终目标是让我的用户使用他们的网络浏览器将文件上传到 S3,我的要求是:

    我必须处理大文件 (2GB+) 我必须支持带有进度指示器的暂停/恢复 (可选但可取!)如果连接暂时中断,则能够恢复上传

我的问题分为两部分:

我已阅读有关 S3 分段上传的信息,但不清楚我该如何 为基于网络浏览器的上传实现暂停/恢复。

甚至可以对大文件执行此操作吗?如果有怎么办?

我是否应该将文件上传到 EC2,然后在完成后将它们移动到 S3?能 我(安全地)将文件直接上传到 S3 而不是使用临时文件。网络服务器?

如果可以直接上传到 S3,我该如何处理暂停/恢复?

附言。我正在使用 PHP 5.2+

【问题讨论】:

是的,您可以安全地让您的访问者上传到 S3,而不会泄露您的 Amazon AWS 凭证,方法是在您的服务器上创建 HMAC 签名签名,然后访问者的浏览器使用该签名直接上传到S3。看看这里:docs.amazonwebservices.com/AmazonS3/latest/dev/… 但是,我不知道这是否可以与 pause/resume-upload 结合使用。 【参考方案1】:

更新 20150527

同时可用的 AWS SDK for javascript (in the Browser) 支持 Amazon S3,包括一个类 ManagedUpload 以支持手头用例的分段上传方面(有关此内容的更多信息,请参阅前面的更新)。相应地,它现在可能是您的方案的最佳解决方案,请参见例如Uploading a local file using the File API 的简洁示例依次使用 html5 File API - 介绍性博客文章 Announcing the Amazon S3 Managed Uploader in the AWS SDK for JavaScript 提供了有关此 SDK 功能的更多详细信息。

更新 20120412

我最初的回答显然错过了重点,所以澄清一下:

如果您想通过简单的 HTML 表单进行基于浏览器的上传,则只能使用 POST Object operation,它使用 HTML 表单将对象添加到指定的存储桶

POST 是 PUT 的另一种形式,它支持基于浏览器的上传 一种将对象放入桶中的方法。传递给 PUT 的参数 而是通过 HTTP 标头作为表单字段传递给 POST multipart/form-data 编码的消息体。 [...]

上传在此处通过单个操作处理,因此不支持暂停/恢复,并将您限制为原始最大对象大小5 GB 或更小

您只能通过Using the REST API for Multipart Upload instead 克服这两个限制,而AWS SDK for php 等SDK 又使用它来实现此功能。

这显然需要一个服务器(例如在 EC2 上)来处理通过浏览器发起的操作(这使您也可以方便地使用 S3 Bucket Policies 和/或 IAM Policies 进行访问控制)。

另一种选择可能是使用 JavaScript 库并执行此客户端,参见例如jQuery Upload Progress and AJAX file upload 用于初始指针。 不幸的是,没有适用于 AWS 的规范 JavaScript SDK(aws-lib 甚至还不支持 S3)——显然knox 的一些分支已经添加了分段上传,参见例如slakis's fork,不过我还没有将其中任何一个用于手头的用例。


初步回答

如果可以将[大文件]直接上传到S3,我该如何处理 暂停/继续?

AWS SDK for PHP支持通过Low-Level PHP API for Multipart Upload将大文件上传到Amazon S3:

AWS SDK for PHP 公开了一个与 用于分段上传的 Amazon S3 REST API(请参阅使用 REST API 分段上传)。 当您需要暂停时使用低级 API 恢复分段上传,在上传期间改变分段大小,或者不 提前知道数据的大小。使用高级 API(请参阅 使用高级 PHP API 进行分段上传) 有这些要求。 [强调我的]

Amazon S3 可以处理从 1 字节一直到 5 TB 的对象,请参阅相应的介绍性帖子 Amazon S3 - Object Size Limit Now 5 TB:

[...] 现在客户可以存储极其 大文件作为单个对象,大大简化了它们的存储 经验。 Amazon S3 为我们在幕后记账 客户,因此您现在可以像以前一样获取该大对象 任何其他 Amazon S3 对象。

为了存储更大的对象,您可以使用我上个月在博客中发布的新 Multipart Upload API 将对象上传到 部分。 [...]

【讨论】:

但是是否可以将这些多部分内容移植到 javascript(或 flash/actionscript)中并在浏览器中执行,而无需提供 aws 凭据? 谢谢 Steffen,但我的理解是低级别不允许直接从客户端传递到 S3(没有 Web 服务器),至少如果我是 PHP example正确...我在这里遗漏了什么吗? @style-sheets:除了直接使用 S3 REST API 探索客户端 JavaScript 解决方案之外,没有办法避免这种情况;我认为这在成本/性能方面不是什么大问题,因为 EC2 到 S3 的连接在一个区域内相当快且免费。显然,这种方法将暂停/恢复问题转移到 HTML 表单上,这再次需要 JavaScript 以及支持File API 的现代浏览器 - 也许How to resume a paused or broken file upload 可以让你开始。 @style-sheets 我相信您可以使用诸如 flash、silverlight 或 java 之类的浏览器插件并直接使用 REST API 来完成此操作。我目前使用 silverlight 插件将大文件(最大 5GB)直接上传到 S3。我还没有实现暂停/恢复不使用 S3 大文件支持,但它应该是可能的。使用插件是实现广泛浏览器覆盖的唯一方法。查看此 SO 线程 ***.com/questions/478799/…。那里有很多指向各种免费和非免费插件的链接。 今天有官方JS SDK。此外,还有一个智能multipart upload API 可用。【参考方案2】:

我不知道有任何 Flash 上传器提供比标准 HTTP Post 更强大的功能,但您可以为客户端开发自己的 Flash 软件,并在服务器上使用协调软件。

【讨论】:

以上是关于支持恢复将大文件上传到 S3的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上使用 Django 将大文件上传到 AWS S3 存储桶而没有 30 秒的请求超时

将大文件从本地机器复制到 S3 时读取端点 URL 超时

将文件上传并压缩到s3

无法将大文件上传到 Google 文档

从 Apache Spark 分段上传到 Amazon S3

将大文件上传到 sitecore 媒体库