web-dev-qa-db-ja.com

Node APIレスポンスとして画像ファイルを高速送信

私はこれをグーグルで検索しましたが、答えが見つかりませんでしたが、それはよくある問題です。これは ノードリクエスト(イメージストリームの読み取り-応答に戻るパイプ) と同じ質問であり、回答はありません。

Express .send()応答として画像ファイルを送信するにはどうすればよいですか? RESTful URLを画像にマッピングする必要がありますが、正しいヘッダーを含むバイナリファイルを送信するにはどうすればよいですか?例えば。、

<img src='/report/378334e22/e33423222' />

呼び出し...

app.get('/report/:chart_id/:user_id', function (req, res) {
     //authenticate user_id, get chart_id obfuscated url
     //send image binary with correct headers
});
41
metalaureate

ExpressにはAPIがあります。

res.sendFile

app.get('/report/:chart_id/:user_id', function (req, res) {
    // res.sendFile(filepath);
});

http://expressjs.com/en/api.html#res.sendFile

63
Po-Ying Chen

ストリームとエラー処理を使用した適切なソリューションは次のとおりです。

const fs = require('fs')
const stream = require('stream')

app.get('/report/:chart_id/:user_id',(req, res) => {
  const r = fs.createReadStream('path to file') // or any other way to get a readable stream
  const ps = new stream.PassThrough() // <---- this makes a trick with stream error handling
  stream.pipeline(
   r,
   ps, // <---- this makes a trick with stream error handling
   (err) => {
    if (err) {
      console.log(err) // No such file or any other kind of error
      return res.sendStatus(400); 
    }
  })
  ps.pipe(res) // <---- this makes a trick with stream error handling
})

with Node 10より古い場合、パイプラインの代わりに pump を使用する必要があります。

1
kharandziuk