uniapp断点下载
uniapp断点下载实现方法
在uniapp中实现断点下载功能,可以通过以下步骤完成:
使用uni.downloadFile API
uniapp提供了uni.downloadFile方法用于文件下载,结合本地存储可实现断点续传功能。关键参数包括url(文件地址)和filePath(保存路径)。

获取已下载文件大小
通过uni.getFileInfo获取本地已下载文件的大小,用于后续设置请求头Range字段。示例代码:
uni.getFileInfo({
filePath: tempFilePath,
success: (res) => {
const downloadedSize = res.size
}
})
设置Range请求头
在下载请求中添加HTTP头Range,指定从已下载位置开始继续下载:

uni.downloadFile({
url: 'https://example.com/file.zip',
header: {
'Range': `bytes=${downloadedSize}-`
},
success: (res) => {
if (res.statusCode === 206) {
// 断点续传成功
}
}
})
保存下载进度
使用uni.setStorageSync将当前下载进度保存到本地,应用重启时可读取进度:
// 保存进度
uni.setStorageSync('downloadProgress', {
url: fileUrl,
downloadedSize: currentSize
})
// 读取进度
const progress = uni.getStorageSync('downloadProgress')
合并文件片段
如果服务器支持分片下载,需要将多个分片合并为完整文件。可通过uni.saveFile和文件流操作实现:
const fs = uni.getFileSystemManager()
fs.appendFile({
filePath: finalPath,
data: chunkData,
success: () => {
// 合并成功
}
})
注意事项
- 服务器必须支持
Range请求,返回206 Partial Content状态码 - 大文件下载建议分片处理,避免内存问题
- 安卓平台需注意文件存储权限问题
- iOS平台需在manifest.json中配置访问白名单
完整示例代码
let downloadTask = null
function startDownload(url) {
const savedProgress = uni.getStorageSync(url)
const downloadedSize = savedProgress ? savedProgress.downloadedSize : 0
downloadTask = uni.downloadFile({
url: url,
header: { 'Range': `bytes=${downloadedSize}-` },
success: (res) => {
if (res.statusCode === 206) {
uni.saveFile({
tempFilePath: res.tempFilePath,
success: (savedRes) => {
console.log('文件保存成功', savedRes.savedFilePath)
}
})
}
}
})
downloadTask.onProgressUpdate((res) => {
uni.setStorageSync(url, {
downloadedSize: downloadedSize + res.totalBytesWritten
})
})
}
function pauseDownload() {
if (downloadTask) {
downloadTask.abort()
}
}






