2016-07-28 9 views
0

ソース(Salesforce)から.tar.gzファイルを読み込み、ディスクに保存しようとしています。 Salesforceに接続するには、Node(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'} –

関連する問題