uni-app 下载文件时,app切到后台,已下载的文件比源文件大

uni-app 下载文件时,app切到后台,已下载的文件比源文件大

测试过的手机:

荣耀20 ,鸿蒙3.0.0

示例代码:

let dtask = plus.downloader.createDownload(downFileUrl, {
filename: '_downloads/' + downFileName
}, (d, status) => {
if (status == 200) {} else {}
})
dtask.addEventListener("statechanged", _this.onStateChanged, false);
dtask.start();

onStateChanged(download, status) {
console.log('监听下载---',download)
},

操作步骤:

在页面A下载文件,app切换到页面B再次创建一个下载任务 , 或者将APP切到后台

预期结果:

文件正常下载

实际结果:

下载后的文件比源文件大

bug描述:

下载文件,app切到后台,已下载的文件比源文件大

图片

信息 描述
产品分类 uniapp/App
PC开发环境 Windows
PC操作系统版本 18363.628
HBuilderX类型 正式
HBuilderX版本 3.99
手机系统 全部
手机厂商 华为
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX
1 回复

在 Uni-app 中,当应用切换到后台时,如果下载的文件大小与源文件不一致,可能是由于以下几个原因导致的:


1. 下载未完成

  • 当应用切换到后台时,下载任务可能被系统暂停或中断,导致文件未完全下载。
  • 如果下载任务未正确恢复,可能会导致文件不完整,甚至文件大小与源文件不一致。

解决方法:

  • 使用支持后台下载的插件或 API,例如 uni.downloadFilebackground 参数。
  • onHide 生命周期中检查下载任务状态,确保任务可以继续在后台运行。
uni.downloadFile({
    url: 'https://example.com/file.zip',
    success: (res) => {
        if (res.statusCode === 200) {
            console.log('下载成功', res.tempFilePath);
        }
    },
    fail: (err) => {
        console.error('下载失败', err);
    },
    complete: () => {
        console.log('下载完成');
    }
});

2. 文件缓存问题

  • 下载的文件可能被缓存到临时路径,如果应用切换到后台,缓存文件可能未正确写入或保存。
  • 下载的文件可能被分段存储,导致文件大小异常。

解决方法:

  • 下载完成后,将文件从临时路径移动到永久存储路径(如 uni.saveFile)。
  • 检查文件的完整性,例如通过文件大小或 MD5 校验。
uni.saveFile({
    tempFilePath: res.tempFilePath,
    success: (saveRes) => {
        console.log('文件保存成功', saveRes.savedFilePath);
    },
    fail: (err) => {
        console.error('文件保存失败', err);
    }
});

3. 系统限制

  • 在某些系统(如 iOS)中,应用切换到后台后,网络请求可能会被限制或暂停,导致下载任务中断。
  • 下载任务可能被系统强制终止,导致文件不完整。

解决方法:

  • 使用系统的后台下载能力(如 iOS 的 Background Fetch 或 Android 的 WorkManager)。
  • onShow 生命周期中检查下载任务状态,并尝试恢复下载。
onShow() {
    // 检查下载任务状态
    if (this.downloadTask) {
        this.downloadTask.onProgressUpdate((res) => {
            console.log('下载进度', res.progress);
        });
    }
}

4. 下载任务管理问题

  • 如果使用 uni.downloadFile,下载任务对象(downloadTask)可能未被正确管理,导致任务丢失或中断。
  • 下载任务可能被重复创建,导致文件被多次写入。

解决方法:

  • 确保下载任务对象被正确保存和管理。
  • 在任务完成或失败后,释放任务对象。
let downloadTask = uni.downloadFile({
    url: 'https://example.com/file.zip',
    success: (res) => {
        console.log('下载成功', res.tempFilePath);
    },
    fail: (err) => {
        console.error('下载失败', err);
    }
});

// 监听下载进度
downloadTask.onProgressUpdate((res) => {
    console.log('下载进度', res.progress);
});

// 取消下载任务
downloadTask.abort();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!