aws s3api head-object --bucket b --key big.zip --query ETag md5sum big.zip aws s3api head-object --bucket b --key big.zip --checksum-mode ENABLED
客户端拿 ETag 和本地算的 MD5 比对,一直不相等,ETag 的值是 9b2cf5...-3。改成小文件单次上传,两边就一致了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:分片上传的 ETag 不是整文件 MD5,而是各分片 MD5 拼起来再算一次,后缀是分片数。拿整文件 MD5 去比对永远不相等。单次上传才会返回文件内容的 MD5。
「ETag 与 MD5」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:分片上传时按同样算法自己算 ETag 再比对;或者改用服务端返回的 checksum 字段;不要用 ETag 当文件内容唯一标识;校验失败时先看对象大小和分片数是否匹配。
确认没问题再收工,用分片算法算出的 ETag 与服务端返回值一致,校验流程通过。
