如何在flutter http,dio或flutter_downloader上调整下载缓冲区大小?

b5lpy0ml  于 2022-12-05  发布在  Flutter
关注(0)|答案(1)|浏览(317)

我想下载一个大约300MB的大文件。它比我想象的要慢得多,当我查看日志时,我发现它正在获取大约8KB大小的字节。我还没有找到调整下载缓冲区大小的方法,即使我寻找其他flutter库。我该如何调整呢?

3j86kqsm

3j86kqsm1#

您可以使用ChunkedStreamReader来处理响应流,使用自定义的chunkSize(例如64KB)并将其写入文件。
在下面的示例中,它将以流的形式侦听响应,然后从ChunkedStreamReader中读取具有所需块大小(64*1024 = 64KB)的字节,并将获得的块写入文件。

// Download file
try {
  int offset = 0;
  var httpClient = http.Client();
  var request = http.Request('GET', Uri.parse(url));
  var response = httpClient.send(request);

  // Open file
  File file = File('$downloadPath.tmp');

  response.asStream().listen((http.StreamedResponse r) async {
    final reader = ChunkedStreamReader(r.stream);
    try {
      // Set buffer size to 64KB
      int chunkSize = 64 * 1024;
      Uint8List buffer;
      do {
        buffer = await reader.readBytes(chunkSize);
        // Add buffer to chunks list
        offset += buffer.length;
        print('Downloading $filename ${downloaded ~/ 1024 ~/ 1024}MB');
        // Write buffer to disk
        await file.writeAsBytes(buffer, mode: FileMode.append);
      } while (buffer.length == chunkSize);

      // Rename file from .tmp to non-tmp extension
      await file.rename(downloadPath);
      print('Downloaded $filename');
    } catch (e) {
      print(e);
    } finally {
      reader.cancel();
    }
  }).onDone(() async {
    // do something when finished
  });
} catch (error) {
  print('Error downloading: $error');
}

编辑日期:2022年3月12日

我刚刚在www.example.com(Chunked_Downloader)上发布了一个包pub.dev,您可以在其中定义构造函数中的块大小:

var chunkedDownloader = await ChunkedDownloader(
    url: 'https://example.com/video.mjpeg',
    savedDir: '/temp',
    fileName: 'sometestfile.mjpeg',
    chunkSize: 1024 * 1024,
    onError: (error) {},
    onProgress: (received, total, speed) {},
    onDone: (file) {})
.start();

相关问题