目標は次のとおりです。
zlib.createGzip()
)次に、zlib出力の読み取りストリームをパイプします。
1)HTTP response
オブジェクト
2)and gzipされた出力を保存するための書き込み可能なファイルストリーム。
今、私は3.1まで行うことができます:
_var gzip = zlib.createGzip(),
sourceFileStream = fs.createReadStream(sourceFilePath),
targetFileStream = fs.createWriteStream(targetFilePath);
response.setHeader('Content-Encoding', 'gzip');
sourceFileStream.pipe(gzip).pipe(response);
_
...正常に動作しますが、gzip圧縮されたデータをファイルに保存するも必要です。これにより、毎回regzipを実行して、gzip圧縮されたデータを応答として直接ストリーミングする必要がなくなります。
Nodeで1つの読み取り可能なストリームを2つの書き込み可能なストリームに一度にパイプするにはどうすればよいですか?
sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);
はNode 0.8.xで動作しますか?
Zlibが読み取り可能なストリームを返し、後で他の複数のストリームにパイプできることがわかりました。だから私は上記の問題を解決するために次のことをしました:
var sourceFileStream = fs.createReadStream(sourceFile);
// Even though we could chain like
// sourceFileStream.pipe(zlib.createGzip()).pipe(response);
// we need a stream with a gzipped data to pipe to two
// other streams.
var gzip = sourceFileStream.pipe(zlib.createGzip());
// This will pipe the gzipped data to response object
// and automatically close the response object.
gzip.pipe(response);
// Then I can pipe the gzipped data to a file.
gzip.pipe(fs.createWriteStream(targetFilePath));
ここでやろうとしているように、パイプチェーン/分割は機能せず、最初の2つの異なるステップに最初のステップを送信します。
sourceFileStream.pipe(gzip).pipe(response);
ただし、次のように、同じ読み取り可能なストリームを2つの書き込み可能なストリームにパイプすることができます。
var fs = require('fs');
var source = fs.createReadStream('source.txt');
var dest1 = fs.createWriteStream('dest1.txt');
var dest2 = fs.createWriteStream('dest2.txt');
source.pipe(dest1);
source.pipe(dest2);