Express Ask Question を使用して NodeJS サーバーからファイルをダウンロードする

Express Ask Question を使用して NodeJS サーバーからファイルをダウンロードする

nodeJS サーバーのページにアクセスして、サーバーにあるファイルを自分のマシンにダウンロードするにはどうすればよいですか?

私は ExpressJS を使用しており、これを試しています:

app.get('/download', function(req, res){

  var file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV', 'binary');

  res.setHeader('Content-Length', file.length);
  res.write(file, 'binary');
  res.end();
});

しかし、ファイル名とファイルの種類 (または拡張子) を取得できません。誰か助けてくれませんか?

ベストアンサー1

アップデート

急行ヘルパーがいるこれにより生活が楽になります。

app.get('/download', function(req, res){
  const file = `${__dirname}/upload-folder/dramaticpenguin.MOV`;
  res.download(file); // Set disposition and send it.
});

古い回答

ブラウザから見た場合、ファイル名は単なる「download」なので、別の HTTP ヘッダーを使用して詳細情報を提供する必要があります。

res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV');

次のような MIME タイプを送信することもできます。

res.setHeader('Content-type', 'video/quicktime');

もっと詳しく知りたい方は、こちらをご覧ください。

var path = require('path');
var mime = require('mime');
var fs = require('fs');

app.get('/download', function(req, res){

  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';

  var filename = path.basename(file);
  var mimetype = mime.getType(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});

ヘッダーの値は好きなように設定できます。この場合、MIMEタイプライブラリを使用しています -ノードマイム、ファイルの MIME タイプを確認します。

ここで注目すべきもう 1 つの重要な点は、readStream を使用するようにコードを変更したことです。ノードは非同期であるため、名前に「Sync」が含まれるメソッドの使用は好ましくないため、これははるかに優れた方法です。

おすすめ記事