一尘不染

Flutter:如何获取http请求的上传/下载进度

flutter

我正在编写一个将图像上传到服务器的应用程序,并且我不希望仅显示微调框,而是希望能够获得该上传状态的进度。

另外,我想这样做而不使用Multipart表单数据。这是我当前正在使用的代码-但它似乎因管道断开而停滞了,对于是否将数据发送到服务器,我的反馈为零:

Future<String> _uploadFile(File assetFile) async {
  final url = <removed>;

  final stream = await assetFile.openRead();
  int length = assetFile.lengthSync();

  final client = new HttpClient();

  final request = await client.postUrl(Uri.parse(url));
request.headers.add(HttpHeaders.CONTENT_TYPE,  "application/octet-stream");
  request.contentLength = length;

  await request.addStream(stream);
  final response = await request.close();
  // response prociessing.
}

是否可以将大数据作为流发送而无需将其读入内存,并且可以使用当前的dart / flutter API在上传中取得进展吗?


阅读 902

收藏
2020-08-13

共1个答案

一尘不染

您已经在使用的Stream方式意味着您没有将整个文件读入内存。它可能以64k块的形式读取。

您可以使用StreamTransformer拦截生产者(文件)和消费者(HttpClient)之间的流,如下所示:

  int byteCount = 0;
  Stream<List<int>> stream2 = stream.transform(
    new StreamTransformer.fromHandlers(
      handleData: (data, sink) {
        byteCount += data.length;
        print(byteCount);
        sink.add(data);
      },
      handleError: (error, stack, sink) {},
      handleDone: (sink) {
        sink.close();
      },
    ),
  );
....
  await request.addStream(stream2);

您应该看到byteCount以64k块递增。

2020-08-13