5

HttpRequest in Dart, is a Stream<List<int>>, how to get the binary content as List<int>?

I tried:

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

It seems I should not use toList. What's the correct method I should use?

4

3 回答 3

9

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

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

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

使用的很酷的一点BytesBuilder是它针对大量二进制数据进行了优化。请注意,我takeBytes用于获取 的内部缓冲区BytesBuilder,避免了额外的副本。

于 2013-07-21T20:32:23.527 回答
8

一种方法是onDonelisten(). 完成后触发回调。然后只需创建一个整数列表并将每个事件添加到其中:

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();
 });
于 2013-07-21T20:25:14.383 回答
2

如果你正在使用dart:html,你可以使用

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

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

List<int> bytes = new Uint8List.view(request.response);
于 2013-07-21T15:09:05.880 回答