2013-07-21 6 views
4

HttpRequestStream<List<int>>입니다. 이진 컨텐츠를 얻는 방법은 List<int>입니까? Dart의 HttpRequest에서 모든 바이너리를 읽는 방법? Dart의

내가 시도 :

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

내가 toList를 사용해서는 안 보인다. 내가 사용해야하는 올바른 방법은 무엇입니까? 당신이 dart:html를 사용하는 경우

답변

6

한 가지 방법. 콜백은 완료되면 시작됩니다. 그럼 그냥 정수의 목록을 작성하고 모든 이벤트마다 그것에 추가 또는

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. 
}); 
나는 또한 BytesBuilder 클래스를 사용하는 앤더스 욘센의 위대한 팁을 추가 할 것입니다

나는 당신이 선호한다고 생각하는 :

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

, 하나 개의 배열 버퍼와 같은 응답을 얻을 수

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

를 사용할 수 있습니다. request.response을 통해 버퍼에 액세스 할 수 있습니다. 그러나 바이트에 액세스하려면 데이터의 Uint8List represenation을 작성해야합니다 : 그것은 listen()onDone 콜백을 설정하는 것입니다 할

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

죄송합니다. 서버 측에서'request'의 내용을 얻고 싶습니다. 나는 AJAX를 사용하여 서버에 파일을 게시하고 컨텐츠를 가져오고 싶습니다. – Freewind

+0

귀하의 질문을 읽은 후 전혀 명확하지 않습니다. 어떻게 업데이트합니까? – Fox32

6

우리는 최근 dart:io에서 사용할 수있는 BytesBuilder을 추가했다. 자세한 내용은 here을 참조하십시오. 귀하의 경우에는

코드는 다음과 같을 수 있습니다 :

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

BytesBuilder을 사용하는 방법에 대한 멋진 점은 이진 데이터의 큰 덩어리에 최적화 있다는 것입니다. BytesBuilder의 내부 버퍼를 가져 오기 위해 takeBytes을 사용 중이므로 여분의 복사본이 필요하지 않습니다.

+0

매우 흥미 롭습니다! –

관련 문제