php - 使用恢复支持将大文件上传到 S3

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

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

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

  1. 我必须处理大文件 (2GB+)
  2. 我必须支持带进度指示器的暂停/恢复
  3. (可选但可取!)能够在连接暂时断开时恢复上传

我的问题分为两部分:

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

是否可以对大文件执行此操作?如果是怎么办?

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

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

附言。我正在使用 PHP 5.2+

最佳答案

更新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 is an alternate form of PUT that enables browser-based uploads as a way of putting objects in buckets. Parameters that are passed to PUT via HTTP Headers are instead passed as form fields to POST in the multipart/form-data encoded message body. [...]

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

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

这显然需要一个服务器(例如在 EC2 上)来处理通过浏览器启动的操作(这允许您方便 S3 Bucket Policies 和/或 IAM Policies 以轻松进行访问控制)。

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


初始答案

If it's possible to upload [large files] directly to S3, how can I handle pause/resume?

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

The AWS SDK for PHP exposes a low-level API that closely resembles the Amazon S3 REST API for multipart upload (see Using the REST API for Multipart Upload ). Use the low-level API when you need to pause and resume multipart uploads, vary part sizes during the upload, or do not know the size of the data in advance. Use the high-level API (see Using the High-Level PHP API for Multipart Upload) whenever you don't have these requirements. [emphasis mine]

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. [...]

关于php - 使用恢复支持将大文件上传到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124785/

相关文章:

php - 保存到mysql时的UTF-8问题

php - 在 PHP 中使用 heredoc 有什么好处?

javascript - 在 img 标签中上传图片

php - Laravel 验证文件数组总允许上传大小

node.js - 如何使用node js仅模糊部分图像

scala - 将 Parquet 文件写入 s3 时出现奇怪的错误

php - 如何删除 json_encode() 函数上的反斜杠?

java - 使用 <t :inputFileUpload> 时出现问题

python-3.x - 在 python 中为 S3 文件夹创建预先签名的 url

php - Mysql插入冲突