大文件分片上传成功,合并后的文件打不开,校验值对不上。乍看像缓存或者权限的锅,追下去往往不是。
parts.sort((a, b) => a.index - b.index); for (const p of parts) await append(p.data); // 校验 md5
追下去是这么回事:分片并发上传完成顺序不定,合并时按完成顺序拼接而不是按分片序号。
「分片上传合并」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,按分片序号排序后合并;记录总分片数与已上传列表;合并后做一次校验。
验收就看一点,合并后的文件可正常打开,校验值与本地一致。