uni.uploadFile 必填参数为 filePath(App/小程序端)或 files(H5端),url 必须带协议;需先调用 chooseImage 或 chooseMessageFile 获取临时路径,多文件需循环调用并控制并发。

uni.uploadFile 上传单个文件时的必填参数
uni.uploadFile 是 uni-app 唯一原生支持的文件上传 API,不支持直接传数组或多个 filePath。它一次只处理一个文件,filePath 必须是本地临时路径(如 tempFilePaths[0]),不能是原始 file:// 或网络地址。
常见错误现象:uploadFile:fail invalid file path,基本都是因为传了 tempFiles 对象、没调用 chooseImage/chooseMessageFile 提前获取路径,或者在 H5 平台误用了 filePath(H5 实际走的是 form-data 模拟,需用 files 字段)。
-
url必须带协议(https://),本地开发时若用http://localhost,App 端会拦截 -
filePath要等uni.chooseImage或uni.chooseMessageFile成功回调后才能拿到,不能写死或延时取 - H5 平台下
filePath无效,得改用files数组 +name字段模拟表单上传
多文件上传必须手动循环调用 uni.uploadFile
没有“一键多传”模式,也不能靠改 filePath 为数组绕过。真实做法是:先批量选文件 → 得到 tempFilePaths 数组 → 用 for 或 Promise.all 控制并发上传。
使用场景:用户一次选了 5 张图,要全部发到服务器;或混合类型文件(图片+PDF)一起提交。
- 并发太多易触发小程序平台限制(如微信限制 10 个 socket 连接),建议控制在 3–5 个并发
- 用
Promise.all时,一个失败会导致整批 rejected,生产环境更推荐for...of+try/catch单独捕获每个错误 - App 和小程序端支持
tempFilePaths直接来自uni.chooseMessageFile(含非图文件),但 H5 只能通过<input type="file">获取,且无法读取真实路径,得用event.target.files
H5 平台上传文件的特殊处理
H5 不走客户端文件系统,uni.uploadFile 的 filePath 参数被忽略,实际依赖 files 字段传 File 对象 —— 这是唯一能绕过“H5 无法上传”的关键。
错误现象:uploadFile:fail no file path 在 H5 出现,不是 bug,是机制使然。
- 必须监听
<input type="file" @change="onFileChange">,从event.target.files拿File实例 - 调用
uni.uploadFile时,删掉filePath,加上files: [{ uri: file, name: 'file', fileName: file.name }] -
fileName推荐显式传,否则后端可能收到blob这类默认名
上传状态和错误处理容易被跳过的细节
很多人只写 success 回调,漏掉 fail 和 complete,导致上传失败无感知、loading 状态卡死、重复点击提交。
性能影响:未限制并发时,iOS App 端可能出现 uploadFile:fail system error,本质是系统 socket 耗尽。
-
fail回调里一定要检查errMsg是否含timeout或network error,区分服务端错误和客户端问题 - 服务器返回非 200 状态码(如 401、500)不会进
fail,而是进success,得在响应体里约定 code 字段做二次判断 - 上传大文件(>10MB)时,App 端建议加
header: { 'Content-Type': 'multipart/form-data' }显式声明,避免某些中间件解析异常










