2013-07-21 4 views

ответ

6

Один из способов сделать это, чтобы установить onDone обратного вызова для listen(). Обратный вызов запускается, когда он завершен. Тогда просто создать список целых чисел и добавить к нему в каждом случае:

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

Я также добавить большой наконечник Андерса Johnsen о использовании BytesBuilder класса , который я думаю, вы должны отдать предпочтение:

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

Если вы используете dart:html, вы можете использовать

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

, чтобы получить ответ в качестве буфера один массив. Вы можете получить доступ к буфере через request.response. Но для доступа к байтам, вам нужно создать Uint8List represenation данных:

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

Извините, я хочу получить содержимое 'request' со стороны сервера. Я использую AJAX для публикации файла на сервере, и я хочу получить контент. – Freewind

+0

Это не совсем понятно после прочтения вашего вопроса, как насчет его обновления? – Fox32

6

недавно мы добавили BytesBuilder доступный в dart:io. См. here для получения дополнительной информации.

В вашем случае код может выглядеть следующим образом:

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

Прохладная вещь об использовании BytesBuilder является то, что она оптимизирована для больших кусков двоичных данных. Обратите внимание, что я использую takeBytes, чтобы получить внутренний буфер BytesBuilder, избегая дополнительной копии.

+0

Очень интересно! –

Смежные вопросы