uniapp 断点下载
实现断点下载的基本原理
断点下载允许在下载中断后从中断点继续下载,避免重复下载已完成的文件部分。核心是通过记录已下载的字节数,并在请求时设置Range头部实现。
使用uni.downloadFile实现断点下载
uni-app的uni.downloadFileAPI本身不支持断点续传,但可以通过以下方式手动实现:

-
记录下载进度 每次下载时,通过
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); }); -
中断后恢复下载 再次启动下载时,从本地存储读取已下载字节数,并设置
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,并包含以下头部:
Accept-Ranges: bytes
Content-Range: bytes 200-1000/1001






