multipart upload overview documentation在分段上传列表部分中有以下警告:
注意
仅使用返回的商家信息进行验证。发送完整的分段上传请求时,不应使用此列表的结果。相反,请维护您在上传零件时指定的零件编号列表以及Amazon S3返回的相应ETag值。
为什么?
为什么我问:假设我想支持恢复被中断的上传。这样做意味着知道要上传的内容,以及已经上传的内容。如果我可以忽略上述警告,那么知道这一点就更简单了。 S3将持久保存已上传部分的列表。我可以从List Parts获得它。
然而,如果我注意到这个警告,而是我需要拦截中断或终止信号并在本地保留上传的部件列表。虽然这是可行的,但如果S3已有列表,那么这样做似乎很愚蠢。
此外,警告说使用列表部件“仅用于验证”。好。假设我坚持自己的列表,并将其与List Parts进行比较。如果他们不匹配,我该怎么办?我会相信List Parts - 如果S3认为它没有一部分,我当然会再次上传它。因此,如果List Parts是最终权威,为什么不首先简单地使用它,并单独使用它?
答案 0 :(得分:3)
如果他们不匹配,我该怎么办?我会相信List Parts - 如果S3认为它没有一部分,我当然会再次上传它。
你错过了警告的重点。
关于是否收到零件并非如此。这是关于他们是否被完整收到。
完成分段上传后,您必须发送部件及其标签的列表。 etags是每个部分的hex md5sum。
完成分段上传的懒惰和粗心的方法是通过从“列表”操作中读取它们来盲目地提交部分的标签。
这是他们警告的内容。
正确的方法是使用您本地创建的列表,根据您认为S3应该收到的内容,您认为每个部分的etag应该基于本地文件。
如果要恢复中断的上传,则应返回并比较已上传的部分(通过重新读取和重新校验本地文件的部分)与S3根据已存储的部分计算的校验和(由列表操作返回)... 然后重新发送任何不正确的部分或缺少部分,或放弃上传,因为如果一个或多个部分与您的本地不匹配,本地文件可能已更改计算
此外,为了数据完整性,您应该发送每个部分的md5,其中包含单个部分上传,base64编码,带有Content-MD5
标头,因为这会导致S3拒绝接受在上传过程中以任何方式损坏的部分。