2

我正在使用 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
4

2 回答 2

2

您在每个部分的响应中返回的 Etag 是您刚刚上传的部分的 md5sum。

在您的示例中,除非我犯了错误,否则您的 Content-MD5 将解码为 a54357aff06328ae46d942af69146b38 ...所以我建议除非您的 MD5 计算有问题,否则您发布的请求和响应不要t 实际上属于一起。

我写的分段上传器非常迂腐,因为我用它来归档关键数据(如此迂腐,事实上,它实际上在它认为分段上传成功绝对确定最终产品之后转身并重新下载文件是完美的)......但是这个实用程序通过一个阻塞的调用顺序提交部件并且在响应返回之前不会返回......并且它的一个健全性测试是将块的本地计算的MD5与Etag 返回,如果它们不匹配,这是一个致命错误……所以除非你有相同的块,否则你似乎可以用这种方式关联这些部分。


额外的:

我没有使用丢失的正文来计算 md5 :) 我拿了你的标题:

Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==

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

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

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

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

于 2013-07-11T02:13:34.303 回答
1

当您启动分段上传时,您会在请求中包含部件号。从 AWS 分段上传文档

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 值和部件号并完成分段上传
于 2013-07-08T20:32:07.220 回答