微信小程序wx.downloadfile下载实现进度条

js:

 data: {
   add:'0',
  },

 daan:function(){ 
     const downloadTask = wx.downloadFile({
      url: 'https://6363-ccs-6g4z452b9e86fd77-1305582300.tcb.qcloud.la/gsdaan/gs2/gs2/%E9%AB%98%E7%AD%89%E6%95%B0%E5%AD%A6%E5%90%8C%E6%B5%8E%E7%AC%AC%E4%B8%83%E7%89%88%E4%B8%8B%E5%86%8C%E4%B9%A0%E9%A2%98%E5%85%A8%E8%A7%A3%E6%8C%87%E5%8D%97%20(1).pdf?sign=31962fd5102ac30d5a73eceeda62e2e2&t=1670580319',      //要预览的PDF的地址
      success: function (res) {
        if (res.statusCode === 200) {   //成功
          var Path = res.tempFilePath //返回的文件临时地址,用于后面打开本地预览所用
          wx.openDocument({
            filePath: Path, //要打开的文件路径
            success: function (res) {
              wx.hideLoading()
              console.log('打开PDF成功');
            }
          })
        }
      },
      fail: function (res) {
        wx.showToast({
          title: '加载失败',
        })
      }
    })

    //进度条
    downloadTask.onProgressUpdate((res)=>{ 
      if (res.progress === 100) {
         this.setData({
           add: '100'
         });
        return 
        } else {
          wx.showLoading({
            title: `正在进入...${res.progress}%`,
          })
          this.setData({
            add: res.progress
          });
        }
    })
  }

.wxml

<text class="title">正在进入:{{add}}%</text>
### 如何在微信小程序中通过 `wx.downloadFile` 实现切片下载后的文件合并 #### 背景说明 在处理大文件下载时,由于网络环境不稳定以及单次请求可能存在的内存占用问题,通常会采用分块下载的方式。这种方式能够有效降低失败风险并提升用户体验。当使用 `wx.downloadFile` 方法完成多个片段的下载后,需要将这些片段重新组合成完整的文件。 --- #### 文件合并的核心逻辑 为了实现文件合并,在微信小程序环境中可以通过以下方式操作: 1. **创建临时目录存储各片段数据** 使用 `wx.getFileSystemManager()` 获取文件管理器实例,并将其用于保存每个片段的数据至本地缓存路径[^1]。 2. **按顺序读取所有片段内容** 需要按照下载时指定的顺序依次读取各个片段的内容,确保最终生成的文件结构与原始一致。 3. **写入目标文件** 将所有片段拼接起来写入一个新的文件对象中,最后删除中间产生的碎片文件以释放空间。 以下是具体的代码示例: ```javascript // 初始化文件系统管理器 const fs = wx.getFileSystemManager(); function mergeFiles(tempFilePaths, outputPath) { const writer = fs.createWriteStream(outputPath); // 创建输出流 let index = 0; function writeNextChunk() { if (index >= tempFilePaths.length) { // 如果已经处理完所有的chunk,则结束流程 console.log('All chunks have been written.'); return; } const currentTempFilePath = tempFilePaths[index]; // 读取当前chunk的内容 fs.readFile({ filePath: currentTempFilePath, encoding: 'binary', success(res) { writer.write(new Buffer.from(res.data, 'binary')); // 写入到目标文件 // 删除已完成的任务对应的temp file fs.unlink(currentTempFilePath, () => {}); ++index; // 移动指针到下一个chunk writeNextChunk(); // 继续执行下一次write }, fail(err) { console.error(`Failed to read chunk ${currentTempFilePath}:`, err); } }); } writeNextChunk(); } ``` 上述函数接受两个参数: - `tempFilePaths`: 存储着每一个已成功下载的片段路径数组; - `outputPath`: 表明最终合成的目标文件位置。 调用此方法前需保证传入的所有路径均指向有效的本地资源。 --- #### 关键点解析 - **异步控制**: 上述例子采用了递归形式来串行化多段数据的操作过程,从而简化同步机制的设计复杂度。 - **错误捕获**: 对于可能出现的各种异常情况都进行了基本覆盖,比如无法打开源文件或者磁盘满等情况下的报错提示。 - **性能优化建议**: 若涉及超大数据量传输,考虑引入更高效的缓冲策略减少频繁IO带来的开销;另外也可以探索利用Web Worker技术进一步隔离主线程压力。 --- #### 注意事项 尽管以上方案适用于大多数常规需求场景,但在实际开发过程中仍需要注意一些细节问题: - 确认设备剩余储存容量足以容纳整个待恢复的大文件及其临时组件。 - 设置合理的重试次数应对偶尔发生的断网状况。 - 用户界面反馈设计也很重要,适时展示进度条可以让使用者更加直观理解当前状态。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生哥编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值