Php 使用恢复支持将大文件上载到S3

Php 使用恢复支持将大文件上载到S3,php,file-upload,amazon-s3,amazon-web-services,multipart,Php,File Upload,Amazon S3,Amazon Web Services,Multipart,(我是亚马逊AWS/S3新手,请耐心等待) 我的最终目标是允许我的用户使用他们的web浏览器将文件上载到S3,我的要求是: 我必须处理大文件(2GB+) 我必须支持带有进度指示器的暂停/恢复 (可选但可取!)在连接暂时中断时恢复上载的功能 我的两部分问题是: 我读过关于S3多部分上传的文章,但不清楚我该怎么做 为基于webbrowser的上载实现暂停/恢复 甚至可以对大文件执行此操作吗?如果是,怎么做 我是否应该将文件上传到EC2,然后在完成后将其移动到S3?可以 我(安全地)直接将文件上

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

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

  • 我必须处理大文件(2GB+)
  • 我必须支持带有进度指示器的暂停/恢复
  • (可选但可取!)在连接暂时中断时恢复上载的功能
  • 我的两部分问题是:

    • 我读过关于S3多部分上传的文章,但不清楚我该怎么做 为基于webbrowser的上载实现暂停/恢复
    甚至可以对大文件执行此操作吗?如果是,怎么做

    • 我是否应该将文件上传到EC2,然后在完成后将其移动到S3?可以 我(安全地)直接将文件上传到S3,而不是使用临时文件。网络服务器
    如果可以直接上传到S3,我如何处理暂停/恢复

    PS.我正在使用PHP5.2+

    更新20150527 同时可用的支持AmazonS3,包括一个支持当前用例的多部分上传方面的类(有关此方面的更多信息,请参阅前面的更新)。因此,它现在可能是适合您的场景的最佳解决方案,请参见,例如,有关依次使用的简明示例,介绍性博客文章提供了有关此SDK功能的更多详细信息

    更新20120412 我最初的回答显然没有抓住要点,因此需要澄清:

    如果要通过简单的HTML表单执行基于浏览器的上载,则必须使用,这将使用HTML表单将对象添加到指定的存储桶中:

    POST是PUT的另一种形式,支持基于浏览器的上载 将物体放入桶中的一种方法。传递给PUT的参数 而是将via HTTP头作为表单字段传递给POST 多部分/表单数据编码的消息正文。[……]

    这里的上载是在一个操作中处理的,因此不支持暂停/恢复,并将您限制为5 GB或更小的原始最大对象大小

    您只能通过来克服这两个限制,而这反过来又被类似的SDK用于实现此功能

    这显然需要一台服务器(例如,在EC2上)来处理通过浏览器启动的操作(这使您能够方便地进行访问控制)

    另一种选择可能是使用JavaScript库并在客户端执行此操作,例如,有关初始指针,请参阅。不幸的是,没有针对AWS的规范化JavaScript SDK可用(令人惊讶的是,它甚至还不支持S3)-显然,一些分支已经添加了多部分上传,例如,我还没有在手头的用例中使用这两个


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

    支持通过以下方式将大型文件上载到Amazon S3:

    AWS SDK for PHP公开了一个与 Amazon S3 REST API用于多部分上传(请参阅使用REST API用于 多部分上传)需要暂停和关闭时使用低级API 恢复多部分上载,在上载过程中更改零件尺寸,或不更改零件尺寸 提前知道数据的大小。使用高级API(请参阅 使用高级PHP API进行多部分上传(如果不需要) 有这些要求。[我的重点]

    Amazon S3可以处理从1字节到5 TB(TB)的对象,请参见相应的介绍性文章:

    […]现在,客户可以存储 大文件作为单个对象,这大大简化了它们的存储 经验AmazonS3为我们的客户进行幕后记账 客户,所以您现在可以像以前一样获取大型对象 任何其他AmazonS3对象

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


    我不知道有哪个flash上传程序提供比标准HTTP Post更强大的功能,但您可以为客户端开发自己的flash软件,并在服务器上安装协调软件。

    是的,您可以让访问者上传到S3,而不必泄露您的亚马逊AWS凭据,通过在服务器上创建HMAC签名,然后访问者的浏览器使用该签名直接上传到S3。看看这里:但是,我不知道这是否可以与pause/resume-upload结合使用。但是,是否可以将此多部分内容移植到javascript(或flash/actionscript)中,并在浏览器中执行,而不泄露aws凭据?谢谢Steffen,但我的理解是,低层不允许从客户端直接传递到S3(没有web服务器),至少如果我是正确的话,这就是它所显示的……我在这里遗漏了什么吗?@样式表:除了直接使用S3 REST API探索客户端JavaScript解决方案之外,没有其他方法可以避免这一点;我不认为这在成本/性能方面是一个很大的问题,因为EC2到S3的连接在一个区域内是相当快速和免费的。显然,这种方法将暂停/恢复问题转移到HTML表单上,这同样需要JavaScript以及支持的现代浏览器-也许可以让您开始使用。@样式表我相信您可以使用浏览器插件(如flash、silverlight或java)并直接使用REST API来完成。我目前使用silverlight插件将大文件(高达5GB)直接上传到S3。我还没有实现暂停/恢复。我不使用S3大文件支持,但这应该是可能的。使用插件是实现广泛浏览器覆盖的唯一方法。签出此SO线程。那里有很多指向各种免费和非免费插件的链接。今天有一个官方网站。此外,还提供了一个智能化的解决方案。