我想下载一个大约300MB的大文件。它比我想象的要慢得多,当我查看日志时,我发现它正在获取大约8KB大小的字节。我还没有找到调整下载缓冲区大小的方法,即使我寻找其他flutter库。我该如何调整呢?
300MB
8KB
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();
1条答案
按热度按时间3j86kqsm1#
您可以使用ChunkedStreamReader来处理响应流,使用自定义的chunkSize(例如64KB)并将其写入文件。
在下面的示例中,它将以流的形式侦听响应,然后从ChunkedStreamReader中读取具有所需块大小(64*1024 = 64KB)的字节,并将获得的块写入文件。
编辑日期:2022年3月12日
我刚刚在www.example.com(Chunked_Downloader)上发布了一个包pub.dev,您可以在其中定义构造函数中的块大小: