12 个分片都传完了,合并出来的 18MB 图片打开只有上半截能看。按 part_*.bin 读出来的顺序是 part_1、part_10、part_11、part_2。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,glob 返回的是字典序,数字没补零时 part_10 会排在 part_2 前面,拼出来的字节流位置全错。合并前也没校验每片的 index,前端并发上传的完成顺序本来就不按编号来。

「分片合并排序」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。

parts = sorted(glob.glob('part_*.bin'), key=lambda p: int(p.split('_')[1].split('.')[0]))
with open('out.jpg', 'wb') as out:
    for p in parts:
        out.write(open(p, 'rb').read())

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,分片命名统一补零到固定宽度 part_0001.bin;合并时按上传记录的 index 排序 不要依赖文件名;拼完算一次整体 sha256 和上传前比对;对不上就丢弃重传 别把坏文件落到正式路径。

最后用这个标准收尾,合并文件大小等于各分片之和 打开没有花屏 前后 sha256 一致。

作者 9823189