uni.uploadfile是唯一稳定跨端上传方案,filepath必须为uni.chooseimage返回的tempfilepaths[0]单个临时路径字符串,name需与后端字段名严格一致,token须放header中,多图需循环调用并控制并发。

直接用 uni.uploadFile 上传临时路径,别转 base64、别走云函数中转、别传数组——这是唯一稳定跨端的方案。
filePath 必须是 tempFilePath,不是字符串也不是网络地址
常见错误现象:uploadFile:fail invalid file path,90% 是因为:
- 把
uni.chooseImage返回的tempFilePaths数组整个传给了filePath(它只收单个字符串) - 用了过期路径:iOS 上
tempFilePath有效期约 30 秒,存起来“稍后上传”大概率失败 - 误把 base64 字符串、
blob:URL 或网络图片地址当成本地路径传进去
正确做法:每次调用 uni.uploadFile 时,filePath 必须是 tempFilePaths[i] 这种即时拿到的单个字符串。H5 端虽支持 File 对象,但为统一逻辑,建议所有平台都走 tempFilePath 路径。
name 和 formData 要匹配后端接收字段
后端用 @RequestParam MultipartFile file(Spring)、req.file(Express + multer)或 ctx.request.files.file(Koa)接收时,name 值必须和后端字段名完全一致。
- 后端要
images[],前端就不能写name: 'file';多图需循环调用,每次传一个filePath,name保持不变(除非后端明确要求带索引) -
formData只能是扁平对象:{ userId: '123', type: 'avatar' }合法,{ user: { id: '123' } }会解析失败 - Token 类认证信息必须放
header里,比如{ Authorization: 'Bearer xxx' },塞进formData后端根本取不到
多图上传必须手动控制并发,不能无脑 for 循环
微信小程序最多同时 10 个 uploadFile 请求,App 端也有类似限制。无节制并发会导致部分请求卡在 pending 或直接返回 400。
- 用
Promise.allSettled+ 分批(如每批 3 个)更稳妥,避免全量失败 - 每张图的状态(
ready/uploading/success/fail)要单独维护,不要共用一个 loading 开关 - 真机调试时,iOS 对临时路径释放极快,上传中途若用户切后台,可能路径已失效——加
fail回调重试逻辑比预判更实际
上传成功后只存 fileID 或服务器返回 URL,别存本地路径
上传成功回调里的 res.data(后端返回)或 res.tempFilePath(H5 特有)都不是最终可用地址。真正该入库的是:
- 后端返回的在线 URL(如
https://xxx.com/uploads/abc.jpg),直接赋给<image src></image> - 如果用 uniCloud,就存
res.fileID(如cloud://xxx/user/123.jpg),它本身可直接渲染,无需拼域名
千万别在数据库里存 tempFilePath 字符串——它下秒就失效,且跨设备无效。也别自己拼 CDN 地址,一旦域名变更,历史数据全废。











