18

前もって申し訳ありませんが、createReadStream() についていくつか質問があります。

基本的に私がやっていることは、ファイルを動的に構築し、終了したら fs を使用してユーザーにストリーミングすることです。私は .pipe() を使用して、正しくスロットリングしていることを確認しています (バッファーがいっぱいの場合は読み取りを停止し、そうでない場合は再度開始するなど)。これまでのコードのサンプルを次に示します。

http.createServer(function(req, res) {
  var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})

  stream.pipe(res);

}).listen(3002, function() {
  console.log('Server listening on port 3002')
})

通常の res.send() と res.end() を使用している場合、.pipe() は .send と .end を呼び出すため、うまく機能することを別の StackOverflow の質問で読みました (申し訳ありませんが、紛失しました)。スロットリングを追加します。

ストリームが完了したらファイルを削除したいのですが、.pipe() を使用しないということは、コールバックを取得するためだけにスロットリングを処理する必要があることを意味します。

したがって、res が通常行うことを行う .send() および .end() メソッドを持つ独自の偽の「res」オブジェクトを作成したいと思いますが、.end() では生成されたファイルをクリーンアップするコードを追加します。私の質問は、基本的にどのようにそれをやってのけるのでしょうか?

これについて助けていただければ幸いです、ありがとう!

4

1 に答える 1

33

ダウンロードに関する最初の部分は、Download file from NodeJS Serverで答えることができます。

ファイルがすべて送信された後にファイルを削除する場合は、独自のイベント ハンドラーを追加して、すべてが送信された後にファイルを削除することができます。

var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})
stream.pipe(res);

var had_error = false;
stream.on('error', function(err){
  had_error = true;
});
stream.on('close', function(){
  if (!had_error) fs.unlink('<filepath>/example.pdf');
});

ハンドラーは 100% 必要ではerrorありませんが、ファイルを送信しようとしたときにエラーが発生した場合は、ファイルを削除しません。

于 2013-02-19T18:45:57.150 に答える