更新 20150527
同时可用的适用于 JavaScript 的 AWS 开发工具包(在浏览器中)支持 Amazon S3,包括一个类ManagedUpload,以支持手头用例的分段上传方面(有关此内容的更多信息,请参阅前面的更新)。相应地,它现在可能是您的场景的最佳解决方案,请参阅例如使用文件 API 上传本地文件以获取依次使用HTML5 文件 API的简明示例- 介绍性博客文章在 AWS 开发工具包中宣布 Amazon S3 托管上传器JavaScript提供了有关此 SDK 功能的更多详细信息。
更新 20120412
我最初的回答显然错过了要点,所以澄清一下:
如果您想通过简单的 HTML 表单进行基于浏览器的上传,则只能使用POST Object 操作,该操作使用 HTML 表单将对象添加到指定的存储桶:
POST 是 PUT 的另一种形式,它允许基于浏览器的上传作为将对象放入存储桶中的一种方式。通过 HTTP 标头传递给 PUT 的参数改为作为表单字段传递给多部分/表单数据编码的消息正文中的 POST。[...]
上传在此处通过单个操作处理,因此不支持暂停/恢复,并将您的原始最大对象大小限制为 5 GB 或更少。
您只能通过使用 REST API 进行分段上传来克服这两个限制,而AWS SDK for PHP等 SDK 又使用该 API来实现此功能。
这显然需要一个服务器(例如在 EC2 上)来处理通过浏览器发起的操作(这也允许您轻松地促进S3 存储桶策略和/或IAM 策略以进行访问控制)。
一种替代方法可能是使用 JavaScript 库并执行此客户端,例如,请参阅jQuery Upload Progress 和 AJAX 文件上传以获取初始指针。不幸的是,没有适用于 AWS 的规范 JavaScript SDK(令人惊讶的是, aws-lib甚至还不支持 S3)——显然,knox的一些分支已经添加了分段上传,参见例如slakis 的分支,我没有使用其中任何一个来使用虽然手头的情况。
初步答案
如果可以将 [大文件] 直接上传到 S3,我该如何处理暂停/恢复?
AWS SDK for PHP支持通过Low-Level PHP API for Multipart Upload将大文件上传到 Amazon S3 :
适用于 PHP 的 AWS 开发工具包公开了一个与用于分段上传的 Amazon S3 REST API 非常相似的低级 API(请参阅使用 REST API 进行分段上传)。当您需要暂停和恢复分段上传、在上传过程中改变分段大小或事先不知道数据大小时,请使用低级 API。只要您没有这些要求,请使用高级 API(请参阅使用高级 PHP API 进行分段上传)。[强调我的]
Amazon S3 可以处理从 1 字节一直到 5 TB 的对象,请参阅相应的介绍性帖子Amazon S3 - Object Size Limit Now 5 TB:
[...] Now customers can store extremely
large files as single objects, which greatly simplifies their storage
experience. Amazon S3 does the bookkeeping behind the scenes for our
customers, so you can now GET that large object just like you would
any other Amazon S3 object.
In order to store larger objects you would use the new Multipart Upload API that I blogged about last month to upload the object in
parts. [...]