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);