Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 为什么不是';t列出与完整的多部分上传一起使用的部件?_Amazon S3 - Fatal编程技术网

Amazon s3 为什么不是';t列出与完整的多部分上传一起使用的部件?

Amazon s3 为什么不是';t列出与完整的多部分上传一起使用的部件?,amazon-s3,Amazon S3,在“多部分上载列表”部分中,具有以下警告: 注意 仅使用返回的列表进行验证。发送完整的多部分上载请求时,不应使用此列表的结果。相反,请维护您在上传部件时指定的部件号列表以及AmazonS3返回的相应ETag值 为什么? 为什么问:假设我想支持恢复被中断的上传。这样做意味着知道还有什么需要上传,因此知道哪些已经上传了。如果我不理会上面的警告,知道这一点就简单多了。S3正在保存已上载部件的列表。我可以从零件列表中获得它 然而,如果我注意到这个警告,我需要截获中断或终止信号,并在本地保存上传的部件列

在“多部分上载列表”部分中,具有以下警告:

注意

仅使用返回的列表进行验证。发送完整的多部分上载请求时,不应使用此列表的结果。相反,请维护您在上传部件时指定的部件号列表以及AmazonS3返回的相应ETag值

为什么?


为什么问:假设我想支持恢复被中断的上传。这样做意味着知道还有什么需要上传,因此知道哪些已经上传了。如果我不理会上面的警告,知道这一点就简单多了。S3正在保存已上载部件的列表。我可以从零件列表中获得它

然而,如果我注意到这个警告,我需要截获中断或终止信号,并在本地保存上传的部件列表。虽然这是可行的,但如果S3已经有了列表,那么这样做似乎很愚蠢

此外,警告说使用列表零件“仅用于验证”。好啊假设我坚持自己的列表,并将其与列表部分进行比较。如果他们不匹配,我该怎么办?我会相信列表部分——如果S3认为它没有部分,当然我会再次上传它。因此,如果列表部分是最终的权威,为什么不首先简单地使用它,并单独使用它呢

如果他们不匹配,我该怎么办?我会相信列表部分——如果S3认为它没有部分,当然我会再次上传它

你没有抓住警告的重点

问题不在于是否收到了零件。问题是它们是否完好无损地收到

当您完成多部分上传时,您必须发送部件及其ETag的列表。ETag是每个部件的十六进制MD5和

完成多部分上传的懒散和粗心的方式是通过从“列表”操作中读取部件的ETag来盲目提交部件的ETag

这就是他们所警告的

正确的方法是使用本地创建的列表,基于您认为S3应该收到的内容,以及您认为每个部分的etag应该是什么,基于本地文件

如果要恢复被中断的上载,应返回并将已上载的部分(通过重新读取本地文件的部分并对其进行校验和)与S3根据已存储的部分(通过列表操作返回)计算的校验和进行比较。。。然后重新发送任何不正确的部分或丢失的部分,或者放弃上载,因为如果一个或多个部分与本地计算不匹配,则本地文件可能已更改


此外,出于数据完整性的考虑,您应该发送每个部件的md5以及单独的部件上载,base64编码,带有
Content-md5
头,因为这将导致S3拒绝接受上载过程中以任何方式损坏的部件。

Hmm,因此,我可能没有注意到警告的要点,因为我确实为每个上传部分请求提供了
Content-MD5
头。因此,如果它在列表部分,它是完整的——或者在我看来是完整的。然而,也许情况并非如此。无论如何,在正常情况下,我提供我自己的零件清单来完成MUP,并且不打算改变这一点。我正在考虑如何支持最简单地为我的代码的客户端恢复中断的上传。感谢您解释警告的要点。“因此,如果它在列表部分中,它就完好无损”是的,在这种情况下,它不可能完好无损。很高兴知道您正在利用S3提供的完整性检查机制。我编写的多部分实用程序两次读取整个文件,两次计算etag,在第一次传递后开始上载,如果任何部分的etag在第二次传递时发生变化,则停止上载。第一步还允许我计算整个文件的sha-1或sha-256,并预测最终上传对象的“xxxx nnn”样式etag是什么。我将这些存储为对象元数据,以供以后验证和进一步保证。可以说,这并不是最佳效率,但数据归档太重要了,不能过分强调完整性。感谢您在2015年的回复。您提到最终完整请求中的etag应该基于“您认为每个部分的etag应该是什么”,但S3在“此etag不一定是对象数据的MD5哈希”中提到了这一点如果不能保证ETag值为MD5,您如何计算它?@jellycsc我希望AWS不要像这样简化他们的文档,直接说当对象使用KMS密钥加密时,它不是原始有效负载的MD5。否则就是。当加密被禁用或使用SSE-S3,但不使用SSE-KMS时,此策略有效。在这种情况下,不幸的是,你无法计算它,这是避免SSE-KMS的几个令人信服的原因之一,而没有经过非常仔细的考虑。另见