[解決済み] 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'が含まれるメソッドを使うことは嫌われるからです。
関連
-
親子コンポーネント通信を解決する3つのVueスロット
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み] jQueryを使ってドロップダウンリスト(セレクトボックス)から選択されたテキストを取得する
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Androidでファイルをダウンロードし、ProgressDialogで進捗を表示する。
-
[解決済み] サーバーを介さずに、ユーザーがダウンロードできるファイルをメモリ上に作成するにはどうすればよいですか?
-
[解決済み] GitHubから単一ファイルをダウンロードする
-
[解決済み] Node.jsでファイルをダウンロードする方法(サードパーティライブラリを使用しない)?
-
[解決済み】NodeJS / Express: "app.use "とは何ですか?
-
[解決済み】JavaScript/jQueryを使ったファイルのダウンロード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
fetch ネットワークリクエストラッパーの説明例
-
Vue+ElementUIによる大規模なフォームの処理例
-
Vueにシンプルなメモ帳機能を実装
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
vueの補間表現とv-textディレクティブの違いについて
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。