新版本hbuilder的uni-app uni.uploadFile

新版本hbuilder的uni-app uni.uploadFile

操作步骤:

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) {
            reject(e)
        }
    })
}

预期结果:

触发success回调

实际结果:

触发fail回调

bug描述:

更新到4.87版本hbuilder的api uni.uploadFile,接口200也返回了数据,但是触发的回调却是fail方法

信息类别 信息内容
产品分类 uniapp/H5
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win10
HBuilderX类型 正式
HBuilderX版本号 4.87
浏览器平台 Chrome
浏览器版本 144.0.7559.59
项目创建方式 HBuilderX

Image 1 Image 2 Image 3 Image 4


更多关于新版本hbuilder的uni-app uni.uploadFile的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

您好,根据现有信息,暂时无法直接判定这是 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 误判为网络错误。

期待您补充日志后继续排查!

更多关于新版本hbuilder的uni-app uni.uploadFile的实战教程也可以访问 https://www.itying.com/category-93-b0.html


filePath 和 files 不能同时为空,参考 https://github.com/dcloudio/uni-app/issues/5923

回到顶部