分片下载功能

2024-03-06  本文已影响0人  Jasper123

/// 分片下载功能
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');

}

上一篇下一篇

猜你喜欢

热点阅读