1. ホーム
  2. javascript

[解決済み] Expressを使用してNodeJSサーバーからファイルをダウンロードする

2022-03-26 14:40:50

質問

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();
});

しかし、ファイル名とファイルタイプ(または拡張子)を取得することができません。どなたか助けていただけませんか?

解決方法は?

更新情報

エクスプレス にはヘルパーがあります。 を使用することで、生活をより簡単にすることができます。

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-typeを送信することもできます。

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.lookup(file);

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

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

ヘッダーの値は好きなものを設定することができます。今回は、mime-typeライブラリ-を使用しています。 ノードマイム で、ファイルのmime-typeが何であるかをチェックします。

ここでもう一つ重要なことは、あなたのコードをreadStreamを使用するように変更したことです。なぜなら、nodeは非同期であることを意図しているので、名前に'Sync'が含まれるメソッドを使うことは嫌われるからです。