4

このコードを使用して、画像をクライアントにパイプしました。

req.pipe(fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res))

動作しますが、画像が完全に転送されない場合あります。ただし、クライアント側(ブラウザー)でもサーバー側(node.js)でもエラーはスローされません。

私の2番目の試みは

var img = fs.readFileSync(__dirname+'/imgen/cached_images/' + link);
res.writeHead(200, {
  'Content-Type' : 'image/png'
});
res.end(img, 'binary');

しかし、それは同じ奇妙な行動につながります...

誰かが私のための手がかりを得ましたか?

(抽象コード...)

var http = require('http');
http.createServer(function (req, res) {
    Imgen.generateNew(
        'virtualtwins/www_leonardocampus_de/overview/28',
        'www.leonardocampus.de',
        'overview',
        '28',
        null,
        [],
        [],
        function (link) {
          fs.stat(__dirname+'/imgen/cached_images/' + link, function(err, file_info) {
                if (err) { console.log('err', err); }
                  console.log('file info', file_info.size);
                  res.writeHead(200, 'image/png');
                  fs.createReadStream(__dirname+'/imgen/cached_images/' + link).pipe(res);
              });
        }
        );
}).listen(13337, '127.0.0.1');

Imgen.generateNew新しいファイルを作成し、それをディスクに保存して、パス(リンク)を返すだけです。

4

2 に答える 2

2

私は以前にこれを使用しました、そして必要なのはそれだけですfunction (req, res) {

var path = ...; 
res.writeHead(200, {
  'Content-Type' : 'image/png'
});
fs.createReadStream(path).pipe(res);

ここpathで、は送信するファイルへの計算されたパスです。.pipe()は、データを読み取りストリームから書き込みストリームに転送し、読み取りストリームが終了すると終了を呼び出すため、後で使用する必要はありませんres.end()

于 2012-07-11T08:09:38.847 に答える
2

問題は何でしたか:私は2つの異なるwriteStreamsを持っていました!WriteStream#1が閉じている場合は、2番目も閉じてから、すべてをパイプ処理する必要があります。

ただし、ノードは非同期であるため、一方が閉じられている間、もう一方は閉じられていません。stream.end()が呼び出されました...まあ、あなたは常にクローズイベントを待つ必要があります!

于 2014-04-26T11:44:55.543 に答える