我正在编写一个将图像上传到服务器的应用程序,并且我不希望仅显示微调框,而是希望能够获得该上传状态的进度。
另外,我想这样做而不使用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在上传中取得进展吗?
您已经在使用的Stream方式意味着您没有将整个文件读入内存。它可能以64k块的形式读取。
Stream
您可以使用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块递增。
byteCount