export function uploadFile(file, callback) {
return new Promise((resolve, reject) => {
try {
let uploadTask = uni.uploadFile({
url: ${config.baseUrl}/iot/upload,
header: {
Authorization: "Bearer " + getToken()
},
file: file,
success:function (res) {
console.log('11111111111',res);
if (res.statusCode === 200) {
let data = JSON.parse(res.data)
resolve(data)
} else {
reject(res)
}
},
fail: function(err) {
console.log('2222222222',err);
reject(err)
}
});
// 监听上传进度
uploadTask.onProgressUpdate((res) => {
if (callback) {
callback(res)
}
});
} catch (e) {
// console.log(e);
reject(e)
//TODO handle the exception
}
})
}
- 发布:2026-01-21 17:41
- 更新:2026-01-21 17:44
- 阅读:18
产品分类: uniapp/H5
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
HBuilderX类型: 正式
HBuilderX版本号: 4.87
浏览器平台: Chrome
浏览器版本: 144.0.7559.59
项目创建方式: HBuilderX
操作步骤:
预期结果:
触发success回调
触发success回调
实际结果:
触发fail回调
触发fail回调
bug描述:
更新到4.87版本hbuilder的api uni.uploadFile,接口200也返回了数据,但是触发的回调却是fail方法
该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
您好,根据现有信息,暂时无法直接判定这是 uni-app 4.87 的框架 bug,但可以先按下面的思路快速自查并补充关键信息,方便官方或社区进一步定位。
一、请先补充 3 个关键信息
- 运行平台:App-Android / App-iOS / H5 / 小程序 / 鸿蒙 Next?
- HBuilderX 控制台完整日志:
• fail 回调里打印err.errMsg、err.statusCode
• success 回调里打印res.statusCode、res.data(脱敏后贴出) - 服务端返回示例:Content-Type、实际 JSON(脱敏后贴出)
| 二、最常见的 3 种“200 却进 fail”场景 | 场景 | 自查办法 | 快速规避 |
|---|---|---|---|
| 1. JSON.parse 抛异常被外层 try/catch 捕获 | 在 success 回调里加 try{ JSON.parse(res.data) }catch(e){ console.error('parse err',e) } |
先 catch 再决定 resolve/reject | |
| 2. statusCode 并非 200(如 302/204/304) | 打印 res.statusCode 确认 |
与服务端对齐实际状态码 | |
3. App 平台缺少 Content-Length 或 Transfer-Encoding 头 |
抓包(Charles、Fiddler)看响应头 | 服务端补全头或改用 chunked |
三、最小复现模板(可直接替换您的代码验证)
uni.uploadFile({
url: 'https://mock.yourdomain.com/iot/upload',
filePath: tempFilePath,
name: 'file',
header: { Authorization: 'Bearer ' + getToken() },
success: (res) => {
console.log('statusCode', res.statusCode);
console.log('rawData', res.data);
try {
const data = JSON.parse(res.data);
console.log('parse ok', data);
} catch (e) {
console.error('parse fail', e);
}
},
fail: (err) => {
console.error('upload fail', err.errMsg, err.statusCode);
}
});
四、下一步
- 按“一”补充信息后,若仍确认是框架问题,请把最小复现仓库(含 mock 接口)提交到 DCloud issues,官方会跟进。
- 如只是 JSON.parse 异常,建议在业务层先兼容处理,避免被 Promise 外层 catch 误判为网络错误。
期待您补充日志后继续排查!