uni-app中uni.uploadFile上传文件的timeout参数不起作用(4.29、4.07、3.7.6版本) 真机测试多个版本均无效

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app中uni.uploadFile上传文件的timeout参数不起作用(4.29、4.07、3.7.6版本) 真机测试多个版本均无效

操作步骤:

官方例子;都是可以上传了;当超时超过配置的时间;也不受控制;忘官方解决这个bug;

预期结果:

希望timeout 可以限制住超时;当我们的上传到30s;可以提示超时;

实际结果:

目前不受控制;感觉设置timeout 没有任何效果;

bug描述:

uni.uploadFile上传文件的timeout参数不起作用;比喻超时时间设置为10ms; 也可以正常上传;timeout完全没有用;

项目信息 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows10和windows11
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 Android
手机系统版本号 Android 11
手机厂商 小米
手机机型 多个品牌多个机型;小米MIX2、三星SM-G988U1;模拟器都不行
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX
App下载地址或H5网址 官方例子随便一个demo,都有这个问题哦

Image 1 Image 2 Image 3


4 回复

这个超时时间是连接超时时间,也就是说网络畅通就不会超时,你想要的效果是这个上传30s就中断,这个考虑自己业务上使用定时器实现。


我也遇到了一样的问题

你好,请问你最终怎么解决的?

uni-app 中使用 uni.uploadFile 方法进行文件上传时,确实有时会遇到 timeout 参数不起作用的问题。这可能是由于某些版本的 uni-app SDK 或者底层网络库存在的bug导致的。尽管我们不能直接修改 SDK,但可以通过一些编程技巧来间接处理这个问题。

以下是一个示例代码,展示了如何在 uni.uploadFile 的基础上,通过自定义的 timeout 逻辑来处理超时情况。这里我们将使用 PromisesetTimeout 来实现这个功能。

// 自定义上传函数,包含超时处理
function uploadFileWithTimeout(url, filePath, formData, customTimeout = 10000) {
    return new Promise((resolve, reject) => {
        // 设置一个定时器用于超时处理
        const timeoutId = setTimeout(() => {
            reject(new Error('Upload timed out'));
        }, customTimeout);

        // 执行文件上传
        uni.uploadFile({
            url: url,
            filePath: filePath,
            name: 'file',
            formData: formData,
            success: (uploadFileRes) => {
                clearTimeout(timeoutId); // 成功上传后清除定时器
                resolve(uploadFileRes);
            },
            fail: (error) => {
                clearTimeout(timeoutId); // 上传失败也清除定时器
                reject(error);
            }
        });
    });
}

// 使用示例
const uploadUrl = 'https://example.com/upload';
const filePath = '/path/to/your/file';
const formData = {
    user: 'testuser'
};

uploadFileWithTimeout(uploadUrl, filePath, formData, 5000) // 自定义超时时间为5秒
    .then(response => {
        console.log('Upload success:', response);
    })
    .catch(error => {
        console.error('Upload error:', error);
    });

在上述代码中,uploadFileWithTimeout 函数封装了 uni.uploadFile,并添加了一个自定义的超时处理逻辑。通过 setTimeout 设置一个定时器,如果文件上传在指定的时间内没有完成(即没有触发 successfail 回调),则定时器会触发并拒绝 Promise,从而抛出超时错误。

这种方法虽然绕过了 uni.uploadFile 自带的 timeout 参数不起作用的问题,但提供了类似的功能,确保了在上传操作超时时能够给出相应的反馈。请注意,这里的 customTimeout 单位是毫秒(ms)。

希望这个解决方案能够帮助你处理 uni.uploadFile 的超时问题。如果问题依然存在,建议查阅最新的 uni-app 文档或社区,看看是否有相关的修复或更新。

回到顶部