如何在Dart中读取HttpRequest中的所有二进制文件?

Fre*_*ind 5 binary stream request dart

HttpRequest在Dart中,是一个Stream<List<int>>,如何获取二进制内容为List<int>

我试过了:

request.toList().then((data) {
    // but data is a List<List<int>> !!!
});
Run Code Online (Sandbox Code Playgroud)

看来我不应该使用toList.我应该使用哪种方法?

Kai*_*ren 8

一种方法是设置onDone回调listen().回调在完成后触发.然后只需创建一个整数列表,并为每个事件添加它:

List<int> data = [];
request.listen(data.addAll, onDone: () {
  // `data` has here the entire contents.
});
Run Code Online (Sandbox Code Playgroud)

或者,这是一个单行:

request.reduce((p, e) => p..addAll(e)).then((data) {
  // `data` has here the entire contents.  
});
Run Code Online (Sandbox Code Playgroud)

我还将添加Anders Johnsen使用BytesBuilder课程的重要提示,我认为您应该更喜欢:

 request.fold(new BytesBuilder(), (b, d) => b..add(d)).then((builder) {
   var data = builder.takeBytes();
 });
Run Code Online (Sandbox Code Playgroud)


And*_*sen 8

我们最近添加了一个BytesBuilder可用的dart:io.有关详细信息,请参见此处

在您的情况下,代码可能如下所示:

request.fold(new BytesBuilder(), (builder, data) => builder..add(data))
    .then((builder) {
      var data = builder.takeBytes();
      // use data.
    });
Run Code Online (Sandbox Code Playgroud)

关于使用的一个很酷的事情BytesBuilder是它针对大块的二进制数据进行了优化.请注意,我正在使用它takeBytes来获取内部缓冲区BytesBuilder,避免额外的副本.