通过简历支持将大文件上传到S3

sty*_*ets 17 php file-upload multipart amazon-s3 amazon-web-services

(我是亚马逊AWS/S3的新手,所以请耐心等待我)

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

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

我的两部分问题是:

  • 我已经阅读了有关S3分段上传的内容,但我不知道如何实现基于webbrowser的上传的暂停/恢复.

甚至可以为大文件执行此操作吗?如果是这样的话?

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

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

PS.我正在使用PHP 5.2+

Ste*_*pel 11

更新20150527

同时可用的AWS SDK for JavaScript(在浏览器中)支持Amazon S3,包括一个类ManagedUpload,以支持手头用例的多部分上传方面(有关详细信息,请参阅前面的更新).现在,它可能是您的场景的最佳解决方案,例如,请参阅使用文件API上传本地文件,以获得依次使用HTML5文件API的简明示例- 介绍博客文章在AWS SDK中宣布Amazon S3托管上传器JavaScript提供了有关此SDK功能的更多详细信息.

更新20120412

我的初步答案显然错过了主要观点,因此要澄清:

如果要通过简单的HTML表单进行基于浏览器的上载,则限制使用POST对象操作,该操作使用HTML表单将对象添加到指定的存储桶:

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

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

您只能通过使用REST API进行分段上传来克服这两个限制,后者又由AWS SDK for PHP用于实现此功能.

这显然需要服务器(例如在EC2上)来处理通过浏览器启动的操作(这使您可以轻松地促进S3存储桶策略和/或IAM策略以进行访问控制).

一种替代方案可能是使用JavaScript库并执行此客户端,请参阅例如jQuery Upload Progress和AJAX文件上载以获取初始指针.不幸的是,没有适用于AWS的规范JavaScript SDK(aws-lib令人惊讶地甚至不支持S3) - 显然knox的一些分支已添加了多部分上传,请参阅例如slakis的fork,我没有使用其中任何一个来使用尽管如此.


初步答复

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

AWS SDK的PHP支持的方式上传大文件到Amazon S3 低级别的PHP API的多部分上传:

AWS SDK for PHP公开了一个与用于分段上传非常类似的Amazon S3 REST API的低级API(请参阅使用REST API进行分段上传).当您需要暂停和恢复分段上传,在上传过程中更改零件尺寸或者事先不知道数据大小时,请使用低级API.只要您没有这些要求,请使用高级API(请参阅使用高级PHP API进行分段上传).[强调我的]

Amazon S3可以处理从1个字节到5 TB的对象,请参阅相应的介绍性文章Amazon S3 - 现在的对象大小限制5 TB:

[...]现在,客户可以将极大的文件存储为单个对象,这极大地简化了他们的存储体验.Amazon S3为我们的客户在幕后进行簿记,因此您现在可以像对待任何其他Amazon S3对象一样获取该大对象.

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

  • @ style-sheets我相信你可以使用flash,silverlight或java等浏览器插件直接使用REST API来实现这一目标.我目前使用silverlight插件将大文件(最多5GB)直接上传到S3.我没有实现暂停/恢复不使用S3大文件支持,但它应该是可能的.使用插件是实现广泛浏览器覆盖的唯一方法.查看此SO主题http://stackoverflow.com/questions/478799/upload-file-directly-to-s3-with-progress-bar.有很多链接到各种免费和非免费插件. (2认同)