2014-05-10 2 views
1

노드의 신속한 컨테이너에서 파일을 가져 오려고합니다.신속한 컨테이너에서 파일을 다운로드하면 파일이 손상됩니다.

내가 (주로 this code에서 영감을) 요청을 만들기 위해이 코드를 사용하고 있습니다 :

var client = https.request(options, function(res) { 
    var buffers = []; 
    res.body=''; 

    res.on('data', function(buffer) { 
     buffers.push(buffer); 

    }); 

    res.on('end', function(err){ 
     res.body = buffers.join(''); 
     callback && callback(res); 

    }); 

    }); 

을하면 다운로드 텍스트 파일, 거기에 아무 문제가 없습니다 만, 바이너리 데이터, 차이가 다운로드 한 파일 사이에 표시하고 원본, 몇 바이트 (mp3 파일의 경우 258) 이후.

그런 손상을 일으킬 수있는 아이디어가 있습니까?

var client = https.request(options, function(res) { 
    res.body=''; 

    res.on('data', function(buffer) { 
     res.body+= buffer.toString('binary'); 
    }); 

    res.on('end', function(err){ 
     callback && callback(res); 
    }); 

    }); 

을하지만 그것이로 작성 : 문자 인코딩, 나는 제거해야 끝나는 문자의 datas를 병합하는 잘못된 방법, ...

갱신

는 나는 그런 일을했다 toString ('binary')이 곧 폐기 될 것이므로 최상의 해결책은 아닙니다.

+0

콜백에서 res.body로 무엇을하고 있습니까? 그것은 바이너리 데이터입니다. 정말로 String으로 변환하지 않아야합니다. 더 좋은 해결책은 콜백에 버퍼를 전달할 수 있고 거기에 순수한 바이너리 데이터로 올바르게 처리하는 것입니다. 내 대답에 예제를 추가했습니다. 아마 도움이 될 것입니다. – CupawnTae

답변

0
buffers.join(''); 

문자열이 바이너리 데이터에 대해 원하는 것이 아닌 배열에 가입합니까? 버퍼를 연결하는 올바른 방법은

Buffer.concat(buffers); 

http://nodejs.org/api/buffer.html#buffer_class_method_buffer_concat_list_totallength

그래서이

var client = https.request(options, function(res) { 
    var buffers=[]; 

    res.on('data', function(buffer) { 
     buffers.push(buffer); 
    }); 

    res.on('end', function(err){ 
     res.body=Buffer.concat(Buffers); 
     callback && callback(res); 
    }); 
}); 

그러나 콜백는 것은 버퍼가 아닌 문자열 예상 할 수 할 수있는 참조입니다. 물론 바이너리 데이터이므로 어쨌든 String이 아니어야합니다.

관련 문제