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



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

我试过了:

request.toList().then((data) {
    // but data is a List<List<int>> !!!
});

我似乎不应该使用toList。我应该使用什么正确的方法?

我们最近在dart:io中添加了一个可用的BytesBuilder。请参阅此处了解更多信息。

在您的情况下,代码可能看起来像这样:

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

使用BytesBuilder的酷之处在于它针对大块二进制数据进行了优化。请注意,我使用takeBytes来获取BytesBuilder的内部缓冲区,避免了额外的副本。

一种方法是为listen()设置onDone回调。回调在完成时激发。然后只需创建一个整数列表,并在每个事件中添加:
List<int> data = [];
request.listen(data.addAll, onDone: () {
  // `data` has here the entire contents.
});

或者,这里有一句话:

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

我还将添加Anders Johnsen关于使用BytesBuilder类的精彩提示,我认为您应该更喜欢它:

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

如果使用dart:html,则可以使用

HttpRequest.request('/blub.bin', responseType: 'arraybuffer').then((request) {

以获得作为一个数组缓冲区的响应。您可以通过request.response访问缓冲区。但要访问字节,您需要创建一个Uint8List数据表示:

List<int> bytes = new Uint8List.view(request.response);

相关内容

  • 没有找到相关文章

最新更新