必须用uni.uploadFile提交图文工单,禁用uni.request发multipart——因小程序端不支持文件流上传,base64拼JSON会导致iOS崩溃、安卓超时、审核被拒;正确做法是:临时路径校验可读性、name与后端字段名严格一致、formData用字符串拼接并encodeURIComponent编码。

必须用 uni.uploadFile 提交图文工单,不能用 uni.request 发 multipart 数据——真机必失败,审核也可能被拒。
为什么不能用 uni.request 传图片
小程序端的 uni.request 不支持文件流上传,即使把图片转成 base64 拼进 JSON,也会触发多个实际问题:
- iOS 真机运行时直接崩溃(内存溢出或沙盒限制)
- 安卓端上传超时,尤其多图或大图场景
- 微信审核不通过,明确违反《小程序文件上传规范》第 3.2 条
uni.uploadFile 的正确调用姿势
关键不是“能不能传”,而是“怎么传才不翻车”。核心是路径、字段名、编码三者对齐:
-
filePath必须是uni.chooseImage返回的临时路径,且需用uni.getFileInfo校验可读性(iOS 15+ 常因沙盒路径异常导致静默失败) -
name是后端解析文件字段的 key,比如后端 expectimages,前端就必须写name: 'images',前后空格都会让后端收不到文件 -
formData只接受字符串,不能传对象:
✘ 错误写法:formData: { address: this.address, desc: this.desc }
✔ 正确写法:formData: `address=${encodeURIComponent(this.address)}&desc=${encodeURIComponent(this.desc)}` - 多张图要循环调用
uni.uploadFile,每次传一张;API 不支持数组式files参数
防重复提交和空图上传的硬性检查
用户点两下、没选图就提交,是线上最常引发工单错乱的两个操作。必须在调用前加判断:
- 提交按钮绑定
disabled+ loading 状态,防止连点;成功/失败后手动重置 - 上传前检查
tempFilePaths.length > 0,否则直接uni.showModal({ content: '请至少上传一张现场照片' }) - 若 iOS 校验
uni.getFileInfo失败,改用uni.downloadFile先拉取到本地缓存目录,再传新路径——这是绕过沙盒路径兼容问题的唯一稳妥方案
真正容易被忽略的,是 formData 中中文不 encodeURIComponent 导致的服务端乱码或截断——PHP 和部分 Java 容器默认不按 UTF-8 解析 query 字符串,这个坑在线上环境往往表现为“用户说填了地址,后台日志里却是空或问号”。











