node.jsサーバ上の静的ファイルを、fsのストリームを使用してクライアントに返却したら、ダウンロードの進捗(プログレスバー)が表示されなかったので対処した話

JavaScript

nodeサーバに置かれた大きめのファイル(max 1GB)を、fsのストリームを使って以下のように返却したところ、プログレスバーが表示されなくて、いつダウンロードが終わるのか分からない状態になった。

const fs = require('fs')

// express のミドルウエア
const download = (req, res, next) => {
  // ファイルのパスを取得する
  const filePath = req.asset.filePath
  // ファイル情報を取得する
  fs.stat(filePath, (err, stat) => {
    if (err) {
      next(err)
    }
    // ファイル名をエンコードする
    const filename = encodeURIComponent(req.asset.title)
    // ヘッダーセットする
    res.set({
      'Content-Type': req.asset.mime,
      'Content-disposition': `inline; filename*=utf-8''${filename}`,
      'Content-Length': stat.size
    })
    filestream = fs.createReadStream(filePath)
    filestream.pipe(res)
  })
})

むむむ、ファイルサイズをヘッダに入れるだけではダメなのか…。

いろいろ調べたところ、どうもkeep aliveが怪しい感じなので、ヘッダに { Connectin: ‘close’ } を追加してみた。

res.set({
  'Content-Type': req.asset.mime,
  'Content-disposition': `inline; filename*=utf-8''${filename}`,
  'Content-Length': stat.size,
   Connection: 'close'   // <== これを追加
})

テストしてみたところ、無事にプログレスバーが表示された。

コメント

タイトルとURLをコピーしました