HarmonyOS 5.0.0 或以上:实现文件下载与断点续传(支持失败重试 + 本地保存)

HarmonyOS 5.0.0 或以上:实现文件下载与断点续传(支持失败重试 + 本地保存)


📌 场景介绍

离线内容缓存场景中,通常需要:

  • 支持文件下载并存储本地(PDF、音频、视频、离线文章)

  • 网络中断或失败后可续传(断点续传)

  • 支持多线程或分块(本篇以单线程断点为主)

本篇实现:

  • 支持下载远程文件并保存至本地

  • 若下载中断,则从已完成部分继续续传

  • 下载进度实时显示,支持失败重试


🧱 页面结构

/entry/src/main/ets
  └── pages/
       └── ResumeDownloadDemo.ets     // 文件断点续传页面

🧩 ResumeDownloadDemo.ets 示例页面

import fs from '@ohos.file.fs'
import request from '@ohos.request'

@Entry
@Component
struct ResumeDownloadDemo {
  @State progress: number = 0
  @State status: string = '未开始'
  private fileUrl: string = 'https://example.com/test.pdf'  // 替换为实际可用的链接
  private localPath: string = '/data/storage/el2/base/files/test_resume.pdf'

  private async startDownload() {
    try {
      this.status = '下载中...'
      const headers: Record<string, string> = {}

      let localSize = 0
      if (await fs.access(this.localPath)) {
        const stat = await fs.stat(this.localPath)
        localSize = stat.size
        headers['Range'] = `bytes=${localSize}-`
      }

      const res = await request.fetch(this.fileUrl, { method: 'GET', header: headers })
      const contentLength = Number(res.headers['content-length'])
      const reader = res.body.getReader()

      const file = await fs.open(this.localPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
      await fs.seek(file.fd, fs.SeekWhence.SEEK_SET, localSize)

      let received = localSize
      while (true) {
        const { done, value } = await reader.read()
        if (done) break
        await fs.write(file.fd, new Uint8Array(value))
        received += value.byteLength
        this.progress = Math.floor((received / (localSize + contentLength)) * 100)
      }

      await fs.close(file.fd)
      this.status = '✅ 下载完成'
    } catch (err) {
      console.error('下载失败:', err)
      this.status = '❌ 下载失败,可重试'
    }
  }

  build() {
    Column() {
      Text("📥 文件断点续传演示").fontSize(22).margin(20)

      Button("开始下载 / 续传").onClick(() => this.startDownload()).margin(10)

      Text(`进度:${this.progress}%`).fontSize(16).margin(6)
      Text(this.status).fontSize(14).fontColor('#888').margin(10)

      Text("本地路径:").fontSize(12).fontColor('#aaa')
      Text(this.localPath).fontSize(12).fontColor('#999')
    }
    .padding(20)
    .height('100%')
  }
}

✅ 效果说明

  • 初次点击开始下载,后续若被中断,再次点击自动从断点续传

  • 下载过程中实时展示进度百分比

  • 文件将保存于 /data/storage/el2/base/files/test_resume.pdf

  • 支持 Range 头实现断点续传(前提:服务器支持)


🔧 拓展建议

  • 支持分块多线程下载 → 最终合并(大文件优化)

  • 支持下载队列、下载状态本地记录

  • 添加暂停 / 取消 / 重试机制

  • 封装为 DownloadManager 模块统一管理下载任务


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值