当前位置:首页 > uni-app

uniapp 断点下载

2026-02-05 23:25:00uni-app

实现断点下载的基本原理

断点下载允许在下载中断后从中断点继续下载,避免重复下载已完成的文件部分。核心是通过记录已下载的字节数,并在请求时设置Range头部实现。

使用uni.downloadFile实现断点下载

uni-app的uni.downloadFileAPI本身不支持断点续传,但可以通过以下方式手动实现:

  1. 记录下载进度 每次下载时,通过onProgressUpdate回调记录已下载的字节数,并持久化存储到本地:

    let downloadedBytes = 0;
    const downloadTask = uni.downloadFile({
      url: 'https://example.com/largefile.zip',
      success: (res) => {
        if (res.statusCode === 200) {
          uni.saveFile({
            tempFilePath: res.tempFilePath
          });
        }
      }
    });
    
    downloadTask.onProgressUpdate((res) => {
      downloadedBytes = res.totalBytesWritten;
      uni.setStorageSync('downloadProgress', downloadedBytes);
    });
  2. 中断后恢复下载 再次启动下载时,从本地存储读取已下载字节数,并设置Range头部:

    const savedBytes = uni.getStorageSync('downloadProgress') || 0;
    const downloadTask = uni.downloadFile({
      url: 'https://example.com/largefile.zip',
      header: {
        'Range': `bytes=${savedBytes}-`
      },
      success: (res) => {
        // 处理文件保存
      }
    });

完整代码示例

// 启动或恢复下载
function startOrResumeDownload() {
  const url = 'https://example.com/largefile.zip';
  const savedBytes = uni.getStorageSync('downloadProgress') || 0;

  const downloadTask = uni.downloadFile({
    url: url,
    header: {
      'Range': `bytes=${savedBytes}-`
    },
    success: (res) => {
      if (res.statusCode === 206 || res.statusCode === 200) {
        uni.saveFile({
          tempFilePath: res.tempFilePath,
          success: (savedRes) => {
            console.log('文件保存成功', savedRes.savedFilePath);
          }
        });
      }
    }
  });

  downloadTask.onProgressUpdate((res) => {
    uni.setStorageSync('downloadProgress', res.totalBytesWritten);
  });
}

// 暂停下载
function pauseDownload() {
  downloadTask.abort();
}

注意事项

  • 服务器必须支持Range请求,否则会返回整个文件
  • 文件保存路径需要处理,避免重复保存
  • 大文件下载建议分片管理,减少内存占用
  • 实际项目中需要添加更多错误处理和状态管理

服务端要求

服务端需要正确响应Range请求,返回状态码206 Partial Content,并包含以下头部:

uniapp 断点下载

Accept-Ranges: bytes
Content-Range: bytes 200-1000/1001

标签: 断点uniapp
分享给朋友:

相关文章

uniapp应用市场

uniapp应用市场

uniapp应用市场概述 Uniapp作为跨平台开发框架,支持将代码编译到iOS、Android、Web及各类小程序平台。其应用市场(插件市场)是开发者获取扩展插件、模板、组件的重要资源库,涵盖UI组…

uniapp组件

uniapp组件

uniapp组件基础概念 uniapp的组件系统基于Vue.js,支持跨平台开发(H5、小程序、App等)。组件分为内置基础组件(如<view>、<button>)和自定义组件…

uniapp指南

uniapp指南

开发环境搭建 下载HBuilderX作为官方推荐的开发工具,支持Windows和Mac系统。安装后创建uni-app项目,选择模板(如默认模板、Hello Uni-app等)。确保Node.js版本在…

uniapp斑马

uniapp斑马

uniapp 斑马相关问题解答 uniapp 斑马打印机连接与使用 uniapp 支持通过蓝牙或网络连接斑马打印机,需要借助原生插件或第三方 SDK。以下为常见方法: 蓝牙连接方式 安装 uni-…

uniapp 美颜

uniapp 美颜

uniapp 美颜实现方法 在uniapp中实现美颜功能可以通过多种方式完成,以下是一些常见的方法: 使用原生插件 uniapp支持调用原生插件实现美颜效果,适用于对性能要求较高的场景。需要开发原生…

uniapp adb

uniapp adb

在UniApp中使用ADB的方法 ADB(Android Debug Bridge)是Android开发中常用的调试工具,可用于UniApp项目的真机调试、日志查看等操作。以下是具体使用方法: 连接…