uni.uploadFile仅支持单文件上传,所谓“批量”需前端控制并发或串行请求;小程序/App用tempFilePaths遍历上传,H5需通过input.files构造files数组;须限制并发数(推荐3)、独立维护各文件状态、避免云函数中转大文件。

uni.uploadFile一次只能传一个文件,不存在“多文件批量上传”的原生能力。所谓“批量”,是前端控制多个单文件请求的并发或串行执行,不是后端接口支持数组参数。
uni.uploadFile 为什么不能直接传数组
它设计上就是单文件语义:参数 filePath(小程序/App)或 files(H5)都只接受单值,传数组会报 uploadFile:fail invalid file path 或静默失败。微信小程序甚至对并发连接数有硬限制(≤3),盲目 Promise.all 多个 uni.uploadFile 调用,会导致部分请求被丢弃且无错误回调。
前端必须按平台区分处理路径
- 小程序/App 端:用
uni.chooseImage或uni.chooseMessageFile拿到tempFilePaths数组,再遍历调用uni.uploadFile({ filePath: item }) - H5 端:
filePath参数无效,必须用拿event.target.files,再构造files: [{ uri: file, name: 'file', fileName: file.name }]传入 - App 端注意
tempFilePath是本地绝对路径(如_doc/xxx.jpg),不能是file://前缀;H5 的File对象不能直接传,得走files字段
并发控制与进度管理不能省略
不加节流的 Promise.all 在弱网或 iOS 下极易出问题。正确做法是:
- 用队列控制最大并发数,推荐设为
3(微信、iOS 均友好) - 每个文件独立维护状态:
status('pending'/'uploading'/'success'/'fail')、progress(初始为0) -
onUploadProgress回调必须绑定到对应索引项,例如this.fileList[i].progress = res.progress,否则所有图片进度互相覆盖 - 失败时记录
index和error.message,不要只弹“上传失败”
云函数场景下别让 uploadFile 走云函数中转
如果你用的是 uniCloud,uniCloud.uploadFile 同样只支持单文件,且云函数默认超时仅 10 秒。试图在云函数里接收多个 base64 或 multipart 数据,再循环调用 uniCloud.uploadFile,会快速触发内存溢出或超时。真正可行的方案是:
- 客户端直传:每个
tempFilePath单独调用uniCloud.uploadFile,生成唯一cloudPath(带扩展名、无空格/中文) - 云函数只做元数据处理:等所有客户端上传成功后,再发一次请求给云函数,只传
fileID列表,用于校验、鉴黄、写库 - 切忌把
fileContent塞进 event 传给云函数——它不解析 multipart,也不自动拆files[]字段
真实批量上传的关键,从来不是“怎么塞更多文件进一个请求”,而是“怎么让每个文件都可控、可重试、可定位”。状态隔离和并发节流,比写一行 Promise.all 重要得多。











