当前位置: 首页 > 知识库问答 >
问题:

Amazon S3多部分上传异步

程承恩
2023-03-14

我正在使用 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个答案

葛骏
2023-03-14

当您启动多部分上载时,您会在请求中包含部件号。来自AWS多部分上传文档:

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

因此,对于您刚刚上传的哪个部分没有歧义。

编辑所以基本流程如下:

> < li>

启动多部分上传并获取UploadId

并行上传所有部件。在每个响应中,您将获得一个ETag标头-您需要记住它和它随附的部件号,以便AWS可以重新组装文件

太叔飞翰
2023-03-14

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

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

我编写的multipart uploader非常迂腐,因为我用它来归档关键数据(因此,实际上,在认为multipPart upload成功并绝对确定最终产品是完美的后,它实际上会翻转并重新下载文件)……但这个实用程序按顺序提交部件,调用会阻塞,直到响应才会返回返回……其健全性测试之一是将本地计算的块的MD5与返回的Etag进行比较,如果它们不匹配,则是一个致命错误……因此,除非您有相同的块,否则似乎可以通过这种方式关联各个部分。

附加:

我没有用失踪的尸体来计算md5:)我拿走了你的头:

Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==

从base64 -转换而来

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

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

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

 类似资料:
  • 我试图用python写的lambda (aws)完成多部分上传。下面是我正在使用的代码。大约有120个部件,总大小为30GB。下面的操作似乎没有在5分钟内完成,因此lambda关闭,上传似乎没有完成。S3提供异步多部分上传功能吗?我相信这将确保文件得到合并,不管lambda关闭。

  • 我正在Spring controller中努力实现多部分文件上传。我读过很多问题,谷歌,但似乎什么都不管用。 我明白了 我的BE控制器: FE,angularJS: HTML: 还有应用程序。属性包括: 更新: 当我按照@Byeon0gam的建议从我的控制器中删除@RequestParam时,我不再会遇到这个错误,但是我的文件在控制器中是空的。虽然在FE服务中,如我所见,它不是空的:

  • 我试图创建一个页面,用户可以张贴图像及其细节。现在,当我测试来自postman的spring boot服务时,我能够成功地在服务中获取文件。当我试图从angular5中做同样的事情时,多部分文件在服务中没有被识别,并且总是得到空数组。 我的角服务代码如下 } 我已经尝试添加标头,如multipart/form-data,并将其设置为un定义。无论哪种方式,我都收到了错误。在发布到这里之前,我已经广

  • 我正在使用这个音频记录和视频文件,它是工作的,但我想用OKHTTP取代它。我没弄明白。有人能帮我一下吗?

  • 我正在使用Spring Boot 1.2。我想上传一个原始二进制文件到控制器。文件大小可能很大,因此我不想将整个请求保存在内存中,而是流式传输文件,事实上,文件是在传输开始时生成的,因此客户端甚至不知道文件的大小。我在这里看到了一个如何使用多部分编码的文件上传进行类似操作的示例。然而,我不想要一个多部分编码的上传,只是一个原始的字节流。我似乎找不到在Spring处理这个用例的方法。

  • 编写代理文件上载的应用程序。我正在使用CURL发布文件,但有一些问题。发布到脚本是正常的,它从脚本发布到下一个服务器就是问题所在。我一直从服务器收到此错误: “请求被拒绝,因为没有找到多部分边界” 这是我的代码: 我在网上读到的所有内容都表明,这应该可行,而且设置标题内容类型也是不必要的,但当我删除内容类型时,我会出现以下错误: 请求不包含多部分/表单数据或多部分/混合流,内容类型标头为null