c***@163.com
c***@163.com
  • 发布:2025-01-17 15:38
  • 更新:2025-01-20 11:25
  • 阅读:69

【报Bug】支付宝内置云存储文件 downloadFile下载时onProgressUpdate的进度信息显示错误

分类:uniCloud

产品分类: uniCloud/支付宝小程序云

示例代码:
    <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 = "https://env-00jxha8zrz4n.normal.cloudstatic.cn/dictionary.br?expire_at=1737099365&er_sign=551772347730b4eb2501d0af75b3947a"  
        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. 点击下载按钮,观察控制台输出

预期结果:

下载进度应输出0-100的进度数据
数据总长度应该不为0

实际结果:

下载进度输出无意义的长数字或者直接为null
数据总长度为0或者直接为null

bug描述:

tempFileURLs变量中如果填写支付宝内置存储空间里的文件URL的话,下载过程中onProgressUpdate的回调函数的progress不正常,以及totalBytesExpectedToWrite总长度字段为0
搜索了一阵子看到好像有人说应该是支付宝云存储那边的content-length为空,应该是和云存储那边的请求头有关??
这个BUG急需修复,用户看不到下载进度体验感非常不好!
代码详见我上传的index.txt中

2025-01-17 15:38 负责人:无 分享
已邀请:
DCloud_uniCloud_VK

DCloud_uniCloud_VK

已知问题,目前支付宝云无法显示下载进度百分比,建议可用扩展存储代替内置存储

要回复问题请先登录注册