Amazon S3 Multipart上传异步

时间:2013-07-08 20:10:07

标签: asynchronous amazon-web-services amazon-s3 multipartform-data

我正在使用Amazon S3多部分上传,我读到您可以并行上传部分文件。但是,通过文档查看,我发现亚马逊对上传文件部分的响应不包含部件号。所以我的问题是,如果我异步上传文件的第1部分和文件的第2部分,那么我检查来自亚马逊的响应如何知道响应是指文件的第1部分还是第2部分?

这是一个示例请求和响应。

Request:
PUT /my-movie.m2ts?partNumber=1&uploadId=VCVsb2FkIElEIGZvciBlbZZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZR HTTP/1.1
Host: example-bucket.s3.amazonaws.com
Date:  Mon, 1 Nov 2010 20:34:56 GMT
Content-Length: 10485760
Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==
Authorization: AWS AKIAIOSFODNN7EXAMPLE:VGhpcyBtZXNzYWdlIHNpZ25lZGGieSRlbHZpbmc=

***part data omitted***

Response:
HTTP/1.1 200 OK
x-amz-id-2: Vvag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg==
x-amz-request-id: 656c76696e6727732072657175657374
Date:  Mon, 1 Nov 2010 20:34:56 GMT
ETag: "b54357faf0632cce46e942fa68356b38"
Content-Length: 0
Connection: keep-alive
Server: AmazonS3

2 个答案:

答案 0 :(得分:2)

您回复每个部分的Etag是您刚刚上传的部分的md5sum。

在你的例子的情况下,除非我犯了错误,你的Content-MD5解码为a54357aff06328ae46d942af69146b38 ...所以我建议除非你的MD5计算有问题,请求和你的回复张贴实际上并不属于一起。

我写的多部分上传器极其迂腐,因为我用它来存档关键数据(实际上这很迂腐,它实际上转向并在认为多部分之后重新下载文件上传成功绝对肯定最终产品是完美的)...但是这个实用程序按顺序提交部件,阻止并且在响应返回之前不会返回...并且其中一个完整性测试是比较返回Etag的块的本地计算MD5,如果它们不匹配则是致命错误...所以除非你有相同的块,否则看起来你可以将那些部分关联起来。


附加:

我没有用丢失的身体来计算md5 :)我拿了你的标题:

Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==

从base64转换 - >二进制 - >十六进制并获得a54357aff06328ae46d942af69146b38。

我通过将2个命令行实用程序串联起来进行验证下载,如下所示:

wget --server-response '$signed_url' -O - | md5sum

这会下载文件并将字节输入md5sum以计算校验和,因此我可以在不使用任何磁盘空间和极少内存的情况下下载无限大文件。 wget实用程序具有内置的重试功能,如果出现连接中断的情况,将尝试从停止的字节位置继续。此管道的输出是文件(stdout)的md5sum和服务器发送的标头以及进度表(stderr)。我的实用程序捕获stdout并进行比较,同时让stderr泄漏到控制台进行观察。

答案 1 :(得分:1)

当您启动分段上传时,请在请求中包含部件号。 From the AWS multipart upload documentation

PUT /ObjectName?partNumber=PartNumber&uploadId=UploadId HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: Size
Authorization: Signature

因此,您刚刚上传的部分没有任何歧义。

编辑所以基本流程如下:

  1. 启动分段上传并获取UploadId

  2. 上传所有部分 在平行下。在每个响应中,您将获得一个ETag标题 - 您需要 要记住它以及AWS可以使用的部件号 重新组装文件

  3. 然后发送所有ETag值和部分 数字并完成分段上传