uni-app uni.uploadFile 上传报错
uni-app uni.uploadFile 上传报错
| 项目 | 内容 |
|---|---|
| 产品分类 | uniapp/H5 |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | win10企业版 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 4.87 |
| 浏览器平台 | Chrome |
| 浏览器版本 | 143.0.7499.170(正式版本) |
| 项目创建方式 | HBuilderX |
示例代码
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['camera'],
success: (chooseImageRes) => {
console.log('上传');
var extensions = that.getFileType(chooseImageRes.tempFiles[0].name)
var fileKey = that.configData.uploadDir + that.newGuid() + "." + extensions;
var fileName = chooseImageRes.tempFiles[0].name;
imageConversion.compressAccurately(chooseImageRes.tempFiles[0], { size: 200, type: chooseImageRes.tempFiles[0].type, })
.then(res => {
that.uploadOss(fileName, fileKey, res)
})
.catch(e => {
console.log(e)
})
}
});
uni.uploadFile({
url: this.configData.host,
file: file, //要上传文件资源的路径
name: 'file',
header: {
'Content-Encodeing': 'UTF-8',
'Cache-Control': 'no-cache',
'x-oss-storge-class': 'Standard',
'x-oss-object-acl': 'private'
},
formData: {
key: fileKey,
policy: this.configData.policy,
OSSAccessKeyId: this.configData.ossAccessKeyId,
signature: this.configData.signature,
success_action_status: '200',
callback: this.configData.callback,
},
success: res => {
更多关于uni-app uni.uploadFile 上传报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
您好,根据您提供的代码和报错信息,结合官方文档与常见踩坑案例,问题基本可以定位在 “把 imageConversion 压缩后得到的 Blob 对象直接当成 file 参数传给 uni.uploadFile” 这一环节。
HBuilderX 4.87 并没有修改 uploadFile 的底层实现,而是 App/H5 各端对 file 参数的类型校验更加严格,导致之前“看似能跑”的写法在新版本暴露出问题。
下面给出 各端的正确写法 与 排查/验证步骤,您按对应平台调整即可解决。
- 先确认运行平台
运行端 是否允许直接传 Blob 正确做法
App-Vue3 ❌ 只能传本地临时路径(filePath)
App-Vue2 ❌ 同上
H5 ✅(需用 files 参数) 把 Blob → File 后放到 files 数组
各家小程序 ❌ 只能传本地临时路径(filePath)
- 各端修正示例
▎App 端(含真机、模拟器)
// 1. 把压缩后的 Blob 保存为本地临时文件
uni.saveFile({
tempFilePath: URL.createObjectURL(blob), // blob 来自 imageConversion
success: ({ savedFilePath }) => {
// 2. 用 filePath 上传
uni.uploadFile({
url: this.configData.host,
filePath: savedFilePath,
name: ‘file’,
formData: { … },
success: (res) => { /* … */ }
});
}
}); ▎H5 端 // 1. Blob → File
const uploadFile = new File([blob], fileName, { type: blob.type });
// 2. 使用 files 参数
uni.uploadFile({
url: this.configData.host,
files: [{ name: ‘file’, file: uploadFile }],
formData: { … },
success: (res) => { /* … */ }
});
- 快速验证
在 uni.uploadFile 之前 console.log(typeof file, file instanceof Blob)
• 如果打印 object true → 说明您当前传的是 Blob,需要按上面改写。
改写后仍报错,请补充:
• 运行端(App-Android / App-iOS / H5 / 小程序)
• imageConversion 版本号
• 真机运行日志(adb logcat 或 Xcode log)
- 参考文档
uni.uploadFile 官方文档
uni.saveFile 官方文档
按以上方式调整后即可消除 “uploadFile:fail file error” 报错。如仍有问题,欢迎继续补充信息。
更多关于uni-app uni.uploadFile 上传报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
参考这个 issue
根据你提供的代码片段,报错原因主要有以下几点:
-
调用时机错误:
uni.uploadFile放在了uni.chooseImage外部,而chooseImage是异步的,上传时会先执行,此时file、fileKey等变量尚未定义(undefined),导致上传参数无效。 -
变量作用域问题:
fileKey、fileName定义在chooseImage的success内部,uni.uploadFile无法访问它们,会报fileKey is not defined或传空值。 -
参数缺失:
uni.uploadFile的file直接写file,但并未定义。应该使用imageConversion.compressAccurately返回的结果res(Blob 对象),直接传入file: res即可(H5 支持 Blob)。 -
Header 拼写错误:
'Content-Encodeing'应改为'Content-Encoding',但 OSS 对象存储通常不需要此字段,可删除。 -
未处理选择图片失败:
chooseImage缺少fail回调,若拍照取消或失败,后续操作不可控。
正确的代码结构(将上传逻辑移到压缩成功回调内):
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['camera'],
success: (chooseImageRes) => {
const tempFile = chooseImageRes.tempFiles[0];
const extensions = that.getFileType(tempFile.name);
const fileKey = that.configData.uploadDir + that.newGuid() + "." + extensions;
const fileName = tempFile.name;
imageConversion.compressAccurately(tempFile, { size: 200, type: tempFile.type })
.then(res => {
// 压缩成功后再上传
uni.uploadFile({
url: that.configData.host,
file: res, // 直接传入 Blob
name: 'file',
header: {
'Cache-Control': 'no-cache',
'x-oss-storge-class': 'Standard',
'x-oss-object-acl': 'private'
},
formData: {
key: fileKey,
policy: that.configData.policy,
OSSAccessKeyId: that.configData.ossAccessKeyId,
signature: that.configData.signature,
success_action_status: '200',
callback: that.configData.callback,
},
success: (uploadRes) => {
console.log('上传成功', uploadRes);
},
fail: (err) => {
console.error('上传失败', err);
}
});
})
.catch(e => {
console.error('压缩失败', e);
});
},
fail: (err) => {
console.error('选择图片失败', err);
}
});

