2016-07-28 3 views
0

소스 (Salesforce)에서 .tar.gz 파일을 읽고 디스크에 저장하려고합니다. Salesforce에 연결하기 위해 노드 (5.6.0)의 jsforce 라이브러리를 사용하고 있습니다. .txt 파일을 검색하여 저장하면 문제없이 정상적으로 작동합니다.Node.js의 이진 버퍼에서 .tar.gz 파일을 만들 수 없습니다.

conn.requestGet('/services/data/v37.0/sobjects/ContentVersion/XXXX/VersionData', {}, function(err, data) { 
    var bitmap = new Buffer(data, 'binary'); 
    fs.writeFileSync('new_file.txt', bitmap, { 
    encoding: 'binary' 
    }); 
}); 

그러나 .tar.gz로 파일을 저장하려고 할 때 문제가 있습니다. 동일한 fs.writeFileSync를 사용하면 파일이 저장되지만 올바른 형식이 아니므로 파일을 열 수 없습니다. 아래 코드에서 tar.gz 및 streamifier를 사용하여 내 버퍼를 스트림으로 변환하지만 작동하지 않습니다. 나 또한 스트림 버퍼를 시도했지만 동일한 문제가 발생합니다.

conn.requestGet('/services/data/v37.0/sobjects/ContentVersion/XXXX/VersionData', {}, function(err, data) { 
    var bitmap = new Buffer(data, 'binary'); 
    var read = streamifier.createReadStream(bitmap); 
    var write = targz().createWriteStream('new_file.tar.gz'); 
    read.pipe(write); 
}); 

내가 오류는 다음과 같습니다

events.js:154 
    throw er; // Unhandled 'error' event 
^
Error: incorrect header check 
at Zlib._handle.onerror (zlib.js:363:17) 

내 문제는 Node.js: Download file from s3 and unzip it to a string과 비슷한 듯 보이지만 내가 파일을 .tar.gz를 사용하고 있기 때문에, 다음이 제안은 도움이하지 않는 것.

+0

tar 파일로 작업하려면'archiver'와 같은 보관 라이브러리를 사용해야 할 것입니다. – dnak

답변

-1

당신의 경우에는 문자열이나 버퍼를 압축하여 zip 파일에 쓰고 싶지만 'read'변수는 실제로 압축 된 것이 아닌 일반적인 버퍼 스트림입니다.

마찬가지로 tar.gz 모듈 및 targz() 함수의 문제점은 압축 된 스트림에 일반 데이터를 쓰는 메커니즘도 제공하지 않으며 문서에서 명확성을 제공하지 않는다는 것입니다. 나는 문서를 읽는 데 시간을 할애하여 메모리 내 데이터가 아니라 파일 및 폴더에서만 작동하도록 설계되었음을 알았습니다.

노드 기반에서 zlib 모듈을 사용하면 문제를 쉽게 해결할 수 있습니다.

#cat t.js 
var fs = require('fs'); 
var zlib = require('zlib'); 

var str = 'hello compressed world!'; 
zlib.gzip(str, function(err, buffer) { 
    if(err) { 
    console.log(err); 
    return; 
    } 
    fs.writeFile('./foo.gz', buffer, function(err, b) { 
    if(err) { 
    console.log(err); 
    return; 
    } 
}); 
}); 
#node t.js 
#file foo.gz 
foo.gz: gzip compressed data, from Unix 
#gunzip foo.gz 
foo already exists -- do you wish to overwrite (y or n)? y 
#cat foo 
hello compressed world!# 

희망이 있으면 도움이 될 것입니다.

+1

여기에 정보를 보내 주셔서 감사합니다. - 조금 도와 줍니다.하지만 제 실제적인 문제는 이미 HTTP 요청에서이 바이너리 데이터가 들어 왔고 zlib.gzip을 호출하는 것은 이미 gzipped이므로 이해가되지 않습니다. 또한 zlib.inflate/unzip 시도하고 그 결과를 파일에 쓰려고하지만 비슷한 오류가 발생합니다. {[오류 : 잘못된 헤더 검사] ​​errno : -3, 코드 : 'Z_DATA_ERROR'} –