asynchronous - Amazon S3 异步分段上传

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

我正在使用 Amazon S3 分段上传,并且我了解到您可以并行上传文件的各个部分。但是,通过查看文档,我发现亚马逊对上传的文件部分的响应不包含部分编号。所以我的问题是,如果我异步上传文件的第 1 部分和文件的第 2 部分,然后检查来自 Amazon 的响应,我如何知道响应是指文件的第 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

最佳答案

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

就您的示例而言,除非我犯了错误,否则您的 Content-MD5 会解码为 a54357aff06328ae46d942af69146b38 ...所以我建议除非您的 MD5 计算有问题,否则您的请求和响应发布的内容实际上并不属于一起。

我编写的分段 uploader 极其迂腐,因为我用它来归档关键数据(事实上,它是如此迂腐,以至于它在认为分段上传后实际上会转身并重新下载文件)上传成功,绝对确定最终产品是完美的)...但是该实用程序通过调用顺序提交各个部分,该调用会阻塞并且在响应返回之前不会返回...并且其健全性测试之一是比较本地计算的带有 Etag 的 block 的 MD5 返回,如果它们不匹配,这是一个 fatal error ...所以除非您有相同的 block ,否则看起来您可以通过这种方式关联各个部分。


附加:

我没有使用丢失的主体来计算 md5 :) 我拿了你的 header :

Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==

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

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

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

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

关于asynchronous - Amazon S3 异步分段上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17535138/

相关文章:

php - 使用 PHP 删除 Amazon S3 中的文件夹

javascript - 将异步函数的结果分配给同步函数中的变量

linux - 如何在 shell 脚本中异步运行迭代

c# - 对 WCF 客户端的异步调用会阻止后续的同步调用

amazon-web-services - 手动触发 AWS CloudWatch 事件

amazon-web-services - AWS : add key pair after creating instance

c# - WebRequest BeginGetResponse/EndGetResponse 在使用 Task.FromAsync 时抛出异常

python - 使用 Python boto3 对大量存储桶进行 S3 默认服务器端加密

python - 我应该如何将我的 s3 凭证传递给 AWS 上的 Python lambda 函数?

amazon-web-services - 无法通过上传到 AWS S3 来触发 AWS Lambda