c***@163.com
c***@163.com
  • 发布:2025-01-17 15:14
  • 更新:2025-01-18 10:31
  • 阅读:30

【报Bug】uni.downloadFile 真机上下载文件超时 time out

分类:uni-app

产品分类: uniapp/小程序/微信

PC开发环境操作系统: Windows

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

HBuilderX类型: 正式

HBuilderX版本号: 4.45

第三方开发者工具版本号: Stable 1.06.2409140

基础库版本号: 3.7.1

项目创建方式: HBuilderX

示例代码:
<template>  
    <view>  
        <button @click="main()">下载</button>  
    </view>  
</template>  

<script setup lang="ts">  
    /**  
     * @desc 函数节流,单位时间内多次执行只执行一次  
     * @param func 函数  
     * @param wait 延迟执行毫秒数  
     * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发  
     */  
    function throttle(func, wait = 1000, type = 1) {  
        let previous = 0;  
        let timeout;  
        return function () {  
            let context = this;  
            let args = arguments;  
            if (type === 1) {  
                let now = Date.now();  

                if (now - previous > wait) {  
                    func.apply(context, args);  
                    previous = now;  
                }  
            } else if (type === 2) {  
                if (!timeout) {  
                    timeout = setTimeout(() => {  
                        timeout = null;  
                        func.apply(context, args)  
                    }, wait)  
                }  
            }  
        }  
    }  
    async function main() {  
        const tempFileURLs = 填写文件下载地址,起码需要下载超过10s的文件(或者适当调整timeout数值)  
        const objPath = `${wx.env.USER_DATA_PATH}/dictionary/`  
        const fileName = "dictionary.br"  
        downloadFile(tempFileURLs, objPath, fileName)  
    }  
    function downloadFile(link, objPath, fileName,timeout =  
        10000) {  
        return new Promise((resolve, reject) => {  
            const csvDownloadTask = uni.downloadFile({  
                url: link, //下载的url  
                timeout: timeout,  
                success: (res) => {  
                    if (res.statusCode === 200) {  
                        console.log(`文件${fileName}下载成功`, res);  
                        resolve(res)  
                        // return true  
                    } else {  
                        console.error(  
                            `文件${fileName}下载失败,code:${res.statusCode}`);  
                        reject(res.statusCode)  
                        return false  
                    }  
                },  
                fail(e) {  
                    console.error(`文件${fileName}下载失败:`, e);  
                    reject(e)  
                    return false  
                }  
            });  
            csvDownloadTask.onProgressUpdate(throttle((res) => {  
                console.log(`${fileName}展示进度obj:`, res);  
                console.log(`${fileName}下载进度:${res.progress}`);  
                console.log(  
                    `${fileName}已经下载的数据长度${res.totalBytesWritten}`);  
                console.log(`${fileName}预期需要下载的数据总长度:${res  
                    .totalBytesExpectedToWrite}`);  
            }, 300));  
        })  
    }  
</script>  

操作步骤:
  1. 修改tempFileURLs变量中的文件地址(我的文件可能会过期)
  2. 运行程序到真机中
  3. 点击下载按钮
  4. 打开控制台查看log

预期结果:

能够正常下载完整的文件

实际结果:

10秒后就提示errno: 5, errMsg: "downloadFile:fail fail:time out"

bug描述:

errno: 5, errMsg: "downloadFile:fail fail:time out"
使用微信开发者调试工具的真机模拟是可以下载文件的,不会超时.
但是一旦使用真机预览,查看控制台就可以看到下面截图的报错,代码里的默认timeout是10000ms也就是10s,按道理这个是与服务器失去连接后10s后报超时错误,但是通过截图可以看到实际上一直都在下载文件,与服务器连接一直通畅的,但是10s到了后就直接报超时了???
我默认使用的是支付宝云存储中的文件,我也试过别的文件,都是在真机预览10s后报超时

2025-01-17 15:14 负责人:无 分享
已邀请:
DCloud_UNI_LXH

DCloud_UNI_LXH

使用其他文件没事,使用支付宝云存储的文件有这个问题是吗?

要回复问题请先登录注册