实现断点续传思路
- 确定已下载位置:记录已经下载的字节数,在后续请求中通过
Range
请求头告知服务器从该位置继续下载。
- 服务器支持:确保服务器端支持断点续传功能,它会根据
Range
头信息,从指定位置开始返回数据。
实时显示下载进度思路
- 监听下载过程:在下载过程中,不断获取已下载的字节数和文件总大小(如果知道)。
- 计算进度:通过已下载字节数除以总大小得出下载进度百分比,实时更新UI显示。
代码层面关键要点
处理 http 请求头
- 设置 Range 头:使用
http
插件发送下载请求时,添加 Range
头字段,格式为 Range: bytes=start-end
,其中 start
是已下载的字节位置,end
可省略表示到文件末尾。例如:
var headers = {
'Range': 'bytes=${alreadyDownloaded}-'
};
var response = await http.get(Uri.parse(url), headers: headers);
- 设置 User - Agent:有些服务器可能根据
User - Agent
来判断请求类型,可设置一个合适的 User - Agent
避免被服务器拒绝。
处理 http 响应头
- 检查响应状态码:断点续传请求成功时,服务器应返回
206 Partial Content
状态码,需检查该状态码确保断点续传成功。
if (response.statusCode == 206) {
// 处理下载数据
}
- 获取文件总大小:可从响应头的
Content - Length
字段获取文件总大小,用于计算下载进度。如果是断点续传,Content - Length
返回的是剩余未下载部分的大小。
int totalLength = int.parse(response.headers['content - length']!);
- 处理响应数据:将新下载的数据追加到已下载文件的末尾。在 Flutter 中,可以使用
File
类的 writeAsBytes
方法,并设置 mode: FileMode.append
来追加数据。
final file = File(filePath);
await file.writeAsBytes(response.bodyBytes, mode: FileMode.append);