大文件上传到最后一步合并时报 EntityTooSmall: Your proposed upload is smaller than the minimum allowed object size。已经传完的 40 个分片全部作废,要重新开始。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

aws s3api create-multipart-upload --bucket b --key big.zip
aws s3api upload-part --bucket b --key big.zip --part-number 1 --body part1
aws s3api complete-multipart-upload --multipart-upload file://parts.json

除最后一片外,每个分片不得小于 5MB,这是服务端的硬性要求。分片大小按文件总大小除以固定片数算,文件偏小时每片就不到 5MB。分片号还要求从 1 开始连续递增。这一点先确认清楚,后面就不用反复试。

「分片合并 EntityTooSmall」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,分片大小固定成 8MB 或 16MB 不要按片数反推;最后一片可以小于 5MB 前面必须够;分片号从 1 连续 不要跳号;失败后重新 initiate 一次 旧 uploadId 直接 abort。

改完照着核一遍,合并返回 200 并给出 ETag,下载回来的文件 MD5 与本地一致。

作者 9823189