uni-app中plus.downloader.createDownload下载文件监听不到文件总大小totalSize
uni-app中plus.downloader.createDownload下载文件监听不到文件总大小totalSize
let downloadPath = appPath;
uni.showModal({
//提醒用户更新
title: “更新提示”,
content: “有新的更新可用,请升级更新!”,
showCancel: false, // 隐藏取消按钮
success: (res) => {
if (res.confirm) {
let showLoading = plus.nativeUI.showWaiting(“正在下载”);
// 用户点击了确认按钮
const dtask = plus.downloader.createDownload(
downloadPath,
{},
(d, status) => {
console.log("----------------statusstatusstatus-----------",status);
const path = (d.filename);
// 下载完成
if (status == 200) {
showLoading.setTitle(“安装中,请勿退出!”);
// 强制更新
plus.runtime.install(path, { force: true },
function () {
plus.nativeUI.closeWaiting();
uni.showModal({
title: “提示”,
content: “安装成功”,
showCancel: false, // 隐藏取消按钮
});
console.log(“整包更新成功”);
plus.runtime.restart();
},
function (e) {
plus.nativeUI.closeWaiting();
uni.showModal({
title: “提示”,
content: “整包更新失败”,
showCancel: false, // 隐藏取消按钮
});
console.error(“整包更新失败,错误原因:” + e);
}
);
} else {
plus.nativeUI.closeWaiting();
uni.showToast({
title: “更新失败”,
duration: 1500,
});
}
}
);
dtask.start(); // 下载任务开始下载
dtask.addEventListener(“statechanged”,
function (task, status) {
console.log("--------------------task---------------", task);
console.log("--------------------task.downloadedSize---------------", task.downloadedSize);
console.log("--------------------task.downloadedSize---------------", task.totalSize);
console.log(
“task.statetask.statetask.state”,
parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
)
);
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
// showLoading.setTitle(‘正在更新’);
break;
case 2:
// showLoading.setTitle(‘已连接到服务器’);
break;
case 3:
showLoading.setTitle(
" 正在下载 - " + parseInt((parseFloat(task.downloadedSize) / parseFloat(task.totalSize)) * 100) + "% "
);
break;
case 4:
//下载完成
plus.nativeUI.closeWaiting();
break;
}
}
);
在 uni-app
中使用 plus.downloader.createDownload
下载文件时,如果监听不到文件总大小 totalSize
,可能是因为某些情况下服务器没有返回 Content-Length
头部信息,或者下载请求未正确处理响应头。以下是一个基本的下载文件示例,同时展示了如何监听下载进度和获取文件总大小。
首先,确保你的项目已经正确配置了 manifest.json
中的 5+ App
权限和模块配置。
// manifest.json
{
"mp-weixin": {},
"plus": {
"distribute": {
"google": {}
},
"permission": {
"Internet": {}
},
"modules": {
"downloader": {}
}
}
}
然后,在你的 uni-app
项目中,使用以下代码进行文件下载:
// pages/index/index.vue
<template>
<view>
<button @click="startDownload">Start Download</button>
</view>
</template>
<script>
export default {
methods: {
startDownload() {
const dtask = plus.downloader.createDownload("https://example.com/yourfile.zip", {}, (d, status) => {
if (status === 200) {
console.log("Download succeeded!");
} else {
console.error("Download failed with status: " + status);
}
});
dtask.addEventListener('statechanged', (e) => {
switch (e.target.status) {
case 1: // 开始下载
console.log('Download started.');
break;
case 2: // 下载中
console.log('Downloaded: ' + e.target.downloadedSize + '/' + (e.target.totalSize || 'unknown'));
break;
case 3: // 下载完成
console.log('Download completed.');
break;
case 4: // 下载失败
console.error('Download failed: ' + e.target.errorMsg);
break;
}
});
dtask.start();
}
}
}
</script>
<style>
/* Add your styles here */
</style>
在这个示例中,我们创建了一个下载任务,并添加了一个 statechanged
事件监听器来监控下载状态。如果服务器正确返回了 Content-Length
头部,e.target.totalSize
将包含文件的总大小。如果 totalSize
为 undefined
或 null
,则可能是因为服务器未提供该信息。
请注意,如果服务器不支持或未配置 Content-Length
,客户端将无法准确知道文件的总大小。在这种情况下,你可能需要依赖其他方式(如服务器端 API)来获取文件大小信息,或者在用户界面上处理未知文件大小的情况。