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

时间:2012-04-12 13:40:19

标签: php file-upload amazon-s3 amazon-web-services multipart

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

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

  1. 我必须处理大文件(2GB +)
  2. 我必须支持暂停/恢复进度指示器
  3. (可选但可取!)如果连接暂时退出,则能够恢复上传
  4. 我的两部分问题是:

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

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

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

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

    PS。我正在使用PHP 5.2 +

2 个答案:

答案 0 :(得分:11)

更新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 Headers作为表单字段传递给POST中的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公开了一个与API非常相似的低级API   用于分段上传的Amazon S3 REST API(请参阅使用REST API for   分段上传)。 需要暂停时使用低级API   恢复分段上传,在上传过程中改变零件尺寸,或者不上传   事先了解数据的大小。使用高级API(请参阅   每当您不使用高级PHP API进行分段上传时   有这些要求。 [强调我的]

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

  

[...]现在客户可以存储极其   大文件作为单个对象,大大简化了它们的存储   经验。亚马逊S3为我们的幕后做了簿记   客户,所以你现在可以像你一样获得那个大对象   任何其他Amazon S3对象。

     

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

答案 1 :(得分:0)

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