问题 HTML5和Amazon S3多部分上传


是否可以使用HTML 5 File API(例如,此库: https://github.com/23/resumable.js )结合S3多部分上传功能?

http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html


4377
2017-08-06 08:53


起源



答案:


是的,但如果要将其作为公共网站的一部分,您将需要某种服务器后端以更安全的方式处理Amazon API密钥。

您可以找到这些项目的完整示例实现:

请注意,我没有使用,测试或审查过这些项目。

序列的粗略描述如下:

  1. 用户
    • 加载网页
    • 选择要上传的文件
    • 点击上传按钮
  2. 网页
    • 将有关文件的信息发送到服务器
  3. 服务器
    • 使用Amazon API创建分段上传
    • 将“key”(文件名)和“upload id”发送回网页
  4. 网页
    • 计算出零件的尺寸
    • 请求服务器签署部分传递“密钥”,“上传ID”,部分信息
  5. 服务器
    • 签署部分请求,发送“部分上传网址”,“日期”和“身份验证标题”
  6. 网页
    • 使用“date”和“auth header”通过“part upload url”将部分数据直接发送到Amazon S3
    • 跟踪部分ID
  7. 服务器和网页
    • 每个附加部分重复5和6,如果需要,重新开始
  8. 网页
    • 向服务器发送“上传完成”请求(传递所有部分信息)
  9. 服务器
    • 向Amazon API发出请求以完成文件的创建
  10. 网页
    • 告知用户错误或成功

笔记:

  • 如果上传中止,这也必须在服务器端处理,否则启动的部分/上传将占用S3 Bucket中的空间。
  • 完成向亚马逊的“上传完成”请求可能需要几分钟时间。

11
2017-10-15 19:28



谢谢你的详细解答!我实际上已经开始实现你之前详述的协议,但还没有实际完成它: github.com/keichan34/s3uploader/tree/2.0-wip - sleepy_keita
太棒了,我注意到你在你的项目中使用了Ruby,还发现了另一个我已添加到答案中的Ruby项目供你参考。 - Dean Taylor
这是PHP中的另一个例子 https://github.com/ienzam/s3-multipart-upload-browser - roundrobin
@BausTheBig这是/答案中链接的第一个项目。显然不太清楚,所以感谢你的评论,我已经更新了答案,使链接更加清晰。 - Dean Taylor
@BausTheBig实际上,大部分项目都是用Javascript编写的,它只需要一个小的服务器端端点,可以用任何语言轻松编写。 “规范”端点是用Python编写的(Flask)。 - Gabi Purcaru


答案:


是的,但如果要将其作为公共网站的一部分,您将需要某种服务器后端以更安全的方式处理Amazon API密钥。

您可以找到这些项目的完整示例实现:

请注意,我没有使用,测试或审查过这些项目。

序列的粗略描述如下:

  1. 用户
    • 加载网页
    • 选择要上传的文件
    • 点击上传按钮
  2. 网页
    • 将有关文件的信息发送到服务器
  3. 服务器
    • 使用Amazon API创建分段上传
    • 将“key”(文件名)和“upload id”发送回网页
  4. 网页
    • 计算出零件的尺寸
    • 请求服务器签署部分传递“密钥”,“上传ID”,部分信息
  5. 服务器
    • 签署部分请求,发送“部分上传网址”,“日期”和“身份验证标题”
  6. 网页
    • 使用“date”和“auth header”通过“part upload url”将部分数据直接发送到Amazon S3
    • 跟踪部分ID
  7. 服务器和网页
    • 每个附加部分重复5和6,如果需要,重新开始
  8. 网页
    • 向服务器发送“上传完成”请求(传递所有部分信息)
  9. 服务器
    • 向Amazon API发出请求以完成文件的创建
  10. 网页
    • 告知用户错误或成功

笔记:

  • 如果上传中止,这也必须在服务器端处理,否则启动的部分/上传将占用S3 Bucket中的空间。
  • 完成向亚马逊的“上传完成”请求可能需要几分钟时间。

11
2017-10-15 19:28



谢谢你的详细解答!我实际上已经开始实现你之前详述的协议,但还没有实际完成它: github.com/keichan34/s3uploader/tree/2.0-wip - sleepy_keita
太棒了,我注意到你在你的项目中使用了Ruby,还发现了另一个我已添加到答案中的Ruby项目供你参考。 - Dean Taylor
这是PHP中的另一个例子 https://github.com/ienzam/s3-multipart-upload-browser - roundrobin
@BausTheBig这是/答案中链接的第一个项目。显然不太清楚,所以感谢你的评论,我已经更新了答案,使链接更加清晰。 - Dean Taylor
@BausTheBig实际上,大部分项目都是用Javascript编写的,它只需要一个小的服务器端端点,可以用任何语言轻松编写。 “规范”端点是用Python编写的(Flask)。 - Gabi Purcaru