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 模块统一管理下载任务