uni-app中plus.downloader.createDownload下载文件监听不到文件总大小totalSize

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

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;
}
}
);


1 回复

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 将包含文件的总大小。如果 totalSizeundefinednull,则可能是因为服务器未提供该信息。

请注意,如果服务器不支持或未配置 Content-Length,客户端将无法准确知道文件的总大小。在这种情况下,你可能需要依赖其他方式(如服务器端 API)来获取文件大小信息,或者在用户界面上处理未知文件大小的情况。

回到顶部