m***@qq.com
m***@qq.com
  • 发布:2025-12-25 16:00
  • 更新:2025-12-25 16:49
  • 阅读:77

【报Bug】uni.uploadFile怎么突然报错:uploadFile:fail file error

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows10

HBuilderX类型: 正式

HBuilderX版本号: 4.87

浏览器平台: Chrome

浏览器版本: 360安全浏览器16,16.1.1139.64(64位))

项目创建方式: HBuilderX

示例代码:

const imgBlob = await fetch(lists[i].url).then(r => r.blob())
const imgFile = new File([imgBlob], lists[i].name, {
type: imgBlob.type
})

uni.uploadFile({
url: apiUrl,
file: file,
fileType:'image',
name: name,
header: {
'Authorization': uni.getStorageSync('token') ? Bearer ${uni.getStorageSync('token')} :
''
},
success: (res) => {
let result = JSON.parse(res.data)
console.log(result);
if (result.code !== '00000') {
uni.showToast({
title: result.msg,
icon: 'error'
})
reject(res)
} else {
resolve(res)
}

},
fail: (err) => {
reject(err)
}
});

操作步骤:

必现

预期结果:

根据接口响应已成功,进到success

实际结果:

进到了fail

bug描述:

前后端代码没有改动,过了两个月,uni.uploadFile出现报错uploadFile:fail file error。而且调用的后台接口返回也是正常的,浏览器看到返回了200,内容也正常。是不是uploadFile的版本改变了,导致了编译结果异常?或者是将上传文件转为Blob的库版本改变了?

2025-12-25 16:00 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

该bug反馈内容基本完整但存在关键缺失:未明确说明运行平台(App/Web/小程序类型),而这是分析uni.uploadFile问题的核心。代码示例存在明显问题——uni.uploadFilefile参数在非Web平台(如App、小程序)需传入本地文件路径字符串,而非File对象(仅Web支持File/Blob)。用户混淆了多端差异:在App平台应使用plus.io.convertLocalFileSystemURL获取路径,而非直接构造File对象。

bug成立但非版本异常:知识库uni.uploadFile文档明确说明各平台实现差异,小程序需配置域名白名单,App平台不支持直接传入File对象。用户遇到的"file error"正是因在非Web环境错误使用File对象导致,与HBuilderX 4.87版本无关(该版本正常支持上传功能)。

建议解决方案:

  1. 若为App平台:改用uni.saveFile保存临时文件后上传路径
  2. 若为小程序:检查后台域名是否已加入白名单
  3. 统一处理:优先使用uni-app官方推荐方案对接uniCloud,避免平台兼容性问题

反馈中"后台返回200但进fail"符合逻辑:客户端因文件参数格式错误提前终止上传,未真正发送请求,故不会触发服务端响应。需补充平台信息和完整错误日志以便精准定位。

内容为 AI 生成,仅供参考
DCloud_UNI_JBB

DCloud_UNI_JBB

filePath 和 files 不能同时为空,必须有一个

  • m***@qq.com (作者)

    之前都是传的file参数,是Blob格式的文件,files是传什么?

    2025-12-25 16:07

  • DCloud_UNI_JBB

    回复 m***@qq.com: 看文档

    2025-12-25 16:22

  • m***@qq.com (作者)

    回复 DCloud_UNI_JBB: 请问是不是依赖库的版本改了?file参数不用了?之前能用的,现在要换成filePath,后台接口也得跟着改,很麻烦的。

    2025-12-25 16:24

  • DCloud_UNI_JBB

    回复 m***@qq.com: 之前这里有问题,修复了一个bug,你要是不好改,可以先回退hx版本

    2025-12-25 16:27

  • m***@qq.com (作者)

    回复 DCloud_UNI_JBB: 好的。HBuilder需要退回到哪个版本?

    2025-12-25 16:28

  • DCloud_UNI_JBB

    回复 m***@qq.com: 4.76 你试试

    2025-12-25 16:29

  • m***@qq.com (作者)

    回复 DCloud_UNI_JBB: 好的,是不是要重新下载hx?有没有命令降版本?

    2025-12-25 16:31

  • m***@qq.com (作者)

    回复 m***@qq.com: 4.76下载解压后运行,报插件【uni-app(vue2)编译器】下载失败,网络请求失败(SsIHandshakeFailedError),这是什么情况?

    2025-12-25 16:51

  • m***@qq.com (作者)

    回复 DCloud_UNI_JBB: HBuilderX能不能不要这么坑人啊!修复bug这么不严谨吗?

    2025-12-25 17:08

m***@qq.com

m***@qq.com (作者)

// #ifdef H5
return new Promise((resolve, reject) => {
uni.uploadFile({
url: apiUrl,
file: file,
fileType:'image',
name: name,
header: {
'Authorization': uni.getStorageSync('token') ? Bearer ${uni.getStorageSync('token')} :
''
},
success: (res) => {
let result = JSON.parse(res.data)
console.log(result);
if (result.code !== '000') {
uni.showToast({
title: result.msg,
icon: 'error'
})
reject(res)
} else {
resolve(res)
}

    },  
    fail: (err) => {  
        reject(err)  
    }  
});  

})
// #endif

完整代码如上,是在H5模式下。

空白人吗

空白人吗 - 7年开发经验 可接APP 小程序 网页 后端 vx:wu1020yt

把 file 去掉,改为 filepath,也就是传入文件本地地址方式,别传入文件对象方式,我也出现了,改为地址方式就正常了

  • m***@qq.com (作者)

    改成filepath,后台接口也需要跟着改吧?

    2025-12-25 16:31

空白人吗

空白人吗 - 7年开发经验 可接APP 小程序 网页 后端 vx:wu1020yt

不需要

  • m***@qq.com (作者)

    我先试一下,即便后台不改,前端所有调用的地方也都要改,太麻烦了。。。。

    2025-12-25 16:55

  • m***@qq.com (作者)

    试过确实不用改后台,直接把file参数名改成filePath,参数值直接传url就可以。只是这也会导致版本整个要调整,简直是现网事故啊!HBuilderX怎么插件升级都不向下兼容的,说的不恰当点,有点像故意搞破坏了。。。

    2025-12-25 16:58

  • m***@qq.com (作者)

    降HBuilderX能解决,我情愿降版本了,不然代码改动太大了,崩溃啊。。。太不靠谱了

    2025-12-25 17:05

  • 空白人吗

    回复 m***@qq.com: 淡定

    2025-12-25 17:47

  • m***@qq.com (作者)

    回复 空白人吗: 嗯,还是淡定下来把涉及的地方都改了。。还好这个版本影响面还不算大。

    2025-12-25 18:36

  • DCloud_UNI_JBB

    回复 m***@qq.com: 这里本来是有bug,才导致了只传file参数也能运行

    2025-12-26 11:21

要回复问题请先登录注册