/// 分片下载功能
Future<void> downloadFile(String url, String savePath) async {
Dio dio = Dio();
// 发送HEAD请求获取文件大小
Response response = await dio.head(url);
int contentLength =
int.parse(response.headers['content-length']?[0] ?? "0");
print('文件大小:$contentLength 字节');
// 设置分片大小
int chunkSize = (contentLength / 5).ceil();
print('分片大小:$chunkSize 字节');
File file = File(savePath);
if (await file.exists()) {
File(savePath).deleteSync();
} else {
file.createSync(recursive: true);
}
// 创建一个文件用于保存下载内容
// 创建一个随机访问文件,用于写入下载内容
RandomAccessFile raf = await file.open(mode: FileMode.write);
// 根据分片大小进行分片下载
for (int i = 0; i < 5; i++) {
int start = i * chunkSize;
int end = (i + 1) * chunkSize - 1;
if (end > contentLength) {
end = contentLength;
}
print('下载分片:$start - $end');
// 发送Range请求下载分片
Response<List<int>> rangeResponse = await dio.get(
url,
options: Options(
headers: {'range': 'bytes=$start-$end'},
responseType: ResponseType.bytes,
),
);
// 将分片写入文件
raf.writeFromSync(rangeResponse.data!);
}
// 关闭文件
await raf.close();
print('文件下载完成:$savePath');
}
网友评论