34

目標は次のとおりです。

  1. ファイル読み取りストリームを作成します。
  2. gzipにパイプします(zlib.createGzip()
  3. 次に、zlib出力の読み取りストリームを次の場所にパイプします。

    1)HTTPresponseオブジェクト

    2)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で圧縮されたデータをファイルに保存する必要もあります。これにより、毎回再圧縮する必要がなくなり、gzipで圧縮されたデータを応答として直接ストリーミングできるようになります。

では、Nodeで1つの読み取り可能なストリームを2つの書き込み可能なストリームに一度にパイプするにはどうすればよいですか?

sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);Node 0.8.xで動作しますか?

4

3 に答える 3

56

パイプのチェーン/分割は、ここで実行しようとしているようには機能せず、最初のステップを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);
于 2013-01-05T17:11:40.453 に答える
17

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));
于 2013-02-03T04:04:25.520 に答える
-1

「読み取り可能なストリームクローン」パッケージを使用できます

const fs = require("fs");
const ReadableStreamClone = require("readable-stream-clone");

const readStream = fs.createReadStream('text.txt');

const readStream1 = new ReadableStreamClone(readStream);
const readStream2 = new ReadableStreamClone(readStream);

const writeStream1 = fs.createWriteStream('sample1.txt');
const writeStream2 = fs.createWriteStream('sample2.txt');

readStream1.pipe(writeStream1)
readStream2.pipe(writeStream2)
于 2020-05-21T14:21:19.490 に答える