uni-app 关于 uni.downloadFile API 的BUG

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

uni-app 关于 uni.downloadFile API 的BUG

类别 信息
产品分类 uniapp/小程序/微信
PC开发环境 Mac
操作系统版本 13.6.6
HBuilderX类型 正式
HBuilderX版本 4.36
工具版本号 1.06.24.09140
基础库版本 3.7.0
项目创建方式 HBuilderX

示例代码:

有效写法

uni.downloadFile({  
    url: fileURL,  
    header:{  
        'myid':String(1),//需要转换  
        'token':xxxxxxxxxx  
    },  
    success: successCallback||function(r) {  
        console.error('success',r);  
    },  
    fail: failCallback||function (e) {  
        console.error('fail',e);  
    },  
    complete: completeCallback||function () {  

    }  
})

无效写法

uni.downloadFile({  
    url: fileURL,  
    header:{  
        'myid':1,  
        'token':xxxxxxxxxx  
    },  
    success: successCallback||function(r) {  
        console.error('success',r);  
    },  
    fail: failCallback||function (e) {  
        console.error('fail',e);  
    },  
    complete: completeCallback||function () {  

    }  
})

操作步骤:

看代码

预期结果:

uni.request 保持一致

实际结果:

uni.downloadFile 需要转换类型。uni.request 不需要转换

bug描述:

uni.downloadFile API 设置自定义 header 参数时,如果值是数字,在真机环境中,无法被传入。 在拦截器中,现在参数是传入的,但是在更底层API中,数字无法传入。 必须是字符串类型。

uni.downloadFile({  
    url: fileURL,  
    header:{  
        'myid':String(1),//需要转换  
        'token':xxxxxxxxxx  
    },  
    success: successCallback||function(r) {  
        console.error('success',r);  
    },  
    fail: failCallback||function (e) {  
        console.error('fail',e);  
    },  
    complete: completeCallback||function () {  

    }  
})

同样的写法,在 uni.request API 中,能正常。在 uni.downloadFile API 坑

uni.request({  
    url: _host + url,  
    data: postData,  
    method: 'POST',  
    header: {  
            'myid':1,//不需要转换  
            'token':xxxxxxxxxx  
                    },  
    success: (res_data) => {  

    },  
    fail: (res_data) => {  

    },complete: () => {  
    }  
});

2 回复

坑啊。大坑


关于uni-app中uni.downloadFile API的潜在问题,确实存在一些已知的情况和注意事项,这可能影响到开发者的使用体验。尽管这些问题不一定能完全归类为“BUG”,但确实值得关注和处理。下面我将通过代码示例来展示一些常见的问题及可能的解决方案,而不是直接给出建议。

1. 文件下载路径问题

在某些平台上,uni.downloadFile下载的文件路径可能不如预期。例如,在Android平台上,文件可能被下载到了应用的私有存储而非公共下载目录。

代码示例

uni.downloadFile({
    url: 'https://example.com/file.zip',
    success: (res) => {
        console.log('下载成功,文件路径:', res.tempFilePath);
        // 注意:这里的res.tempFilePath可能是一个内部路径,不能直接访问
    },
    fail: (err) => {
        console.error('下载失败:', err);
    }
});

解决方案

  • 如果需要访问下载的文件,可以考虑使用uni.saveFile将文件保存到用户可访问的目录。

2. 下载进度不更新

有时开发者可能会遇到下载进度条不更新的问题,这可能是由于事件触发机制或异步处理不当导致的。

代码示例

let downloadTask = uni.downloadFile({
    url: 'https://example.com/largefile.zip',
    success: (res) => {
        // 处理下载成功
    },
    fail: (err) => {
        // 处理下载失败
    }
});

downloadTask.onProgressUpdate((res) => {
    console.log('下载进度:', res.progress);
    // 更新UI进度条
});

解决方案

  • 确保onProgressUpdate回调被正确注册并接收进度事件。
  • 检查是否有其他异步操作干扰了进度事件的接收。

3. 跨域问题

如果下载的文件位于不同的域,可能会遇到跨域请求问题,导致下载失败。

代码示例

uni.downloadFile({
    url: 'https://anotherdomain.com/file.pdf', // 跨域请求
    success: (res) => {
        // 处理成功情况
    },
    fail: (err) => {
        console.error('跨域下载失败:', err);
    }
});

解决方案

  • 确保服务器支持CORS(跨源资源共享)。
  • 如果无法控制服务器,考虑使用代理服务器来绕过跨域限制。

以上示例展示了在使用uni.downloadFile时可能遇到的问题及其代码层面的处理方式。开发者在遇到类似问题时,可以根据具体情况调整代码逻辑。

回到顶部