uni.uploadFile 本身不支持并发,顺序错乱源于前端未用 index 字段标识顺序或后端未按 index 组织数据;应通过 formData 传 index、预分配数组存储结果或限流串行上传来保障顺序一致性。

uni.uploadFile 本身不支持并发,顺序错乱是伪并发控制失效的表象
直接结论:uni.uploadFile 每次调用只发一个请求,所谓“并发”全是前端手动循环或 Promise.all 拼出来的。顺序错乱不是 API 的 bug,而是你没管住上传完成的先后与业务顺序之间的映射关系。后端如果按接收顺序写入、或前端没带序号字段,结果自然对不上。
用 index 字段 + formData 确保每张图带唯一顺序标识
微信小程序和大多数后端都依赖 formData 传业务元信息,index 是最轻量可靠的顺序锚点。别指望响应顺序 = 请求顺序,尤其在弱网或服务端排队时。
-
uni.uploadFile的formData必须包含index: i(从 0 或 1 开始,保持前后端一致) - 后端接收时,必须用这个
index而不是数组下标来组织图片列表 - 如果后端无法改,前端就需在
Promise.all的then回调里,用原始索引重建顺序:比如把每个res存进results[i] = res,而不是push - H5 端若用
FormData手动构造,注意append('index', i)要在append('file', blob)之前或之后都行,但必须存在
别无脑 Promise.all,优先用串行 + 并发数限制
真并发(如 Promise.all)在小程序端极易触发域名并发限制(通常 5~6 个),导致部分请求被挂起甚至失败,进一步放大顺序混乱。串行虽慢,但可控;加限流才是平衡点。
- 小程序端建议用
for...of+await保证绝对顺序,适合对一致性要求高的场景(如证件照多页) - 需要提速时,用
p-limit或手写简易限流器,控制同时最多 3~4 个uni.uploadFile在跑 - APP 端可放宽到 5~6,H5 端看浏览器,但超过 6 个基本无收益,反而增加失败率
- 每次上传成功后,立即更新 UI(如标记“已上传第2张”),比等全部结束再刷新更可靠
后端不认 index?那就前端自己排序再提交
有些老接口只收一个 files[] 数组,且不解析额外字段。这时前端必须承担排序责任:所有上传完成后再统一整理,按原始顺序拼成新数组,再走一次聚合接口。
- 上传阶段用
const results = new Array(filePaths.length)预分配数组 - 每个
uploadSingleFile成功后,执行results[index] = { url: res.data.url, name: fileName } - 全部完成后过滤空项(防某张失败),再调用
uni.request提交完整 JSON 到聚合接口 - 这招绕过所有上传顺序问题,但多一次请求,适合图片数少(≤5)、且后端拒改的情况
Promise.all 返回数组顺序固定,其实某个请求超时重试后插队成功了**。顺序不是默认属性,是必须显式约定并双向校验的契约。


















