web-dev-qa-db-ja.com

NodeJS sendFileとファイル名のダウンロード

私はこのコードでクライアントにファイルを送信しようとします:

router.get('/get/myfile', function (req, res, next) {
  res.sendFile("/other_file_name.dat");
});

それはうまくいきますが、ユーザーがこのファイルをURLからダウンロードするときに必要です:

http://mynodejssite.com/get/myfile

ブラウザへのファイル名は、「myfile」ではなく「other_file_name.dat」でなければなりません。

8

特別な方法があります res.download

それはあなたのためにすべてをカバーします;)

router.get('/get/myfile', function (req, res) {
    res.download("/file_in_filesystem.dat", "name_in_browsers_downloads.dat");
});

これは私の解決策です:

var fs = require('fs');
var path = require('path');
const transfer = exports;

transfer.responseFile = function (basePath, fileName, res) {
    var fullFileName = path.join(basePath, fileName);

    fs.exists(fullFileName, function (exist) {
        if (exist) {
            var filename = path.basename(fullFileName);

            res.setHeader('Content-Disposition', 'attachment; filename=' + filename);
            res.setHeader('Content-Transfer-Encoding', 'binary');
            res.setHeader('Content-Type', 'application/octet-stream');

            res.sendFile(fullFileName)
        } else {
            res.sendStatus(404);
        }
    });
};

そしてそれを使う:

router.get('/myfile', function (req, res) {
    transfer.responseFile("/var/nodejs", 'fileToDownload.dat', res);
});

すべてのヘルパーに感謝します:)

8

以下のような複数のルートがある場合: "/ get/myfile1"、 "/ get/myfile2"、 "/ get/myfile

汎用的なものを作ってみませんか?これはすべてのリクエストを処理でき、リンク(download_name)の問題も解決します。あなたは以下のようにそれを行うことができます

router.get('/get/:fileName',function(req,res){
    res.sendFile('/file_path/'+req.params.fileName)
});

コメント後に編集(EDIT 1):

申し訳ありませんが、あなたのポイントはわかりませんでした。私はあなたがバックエンドAPIを開発しているなら、あなたもURLを選択するコントロールを持つべきだと思いますよね?

例を挙げます:

サーバー側がこれであるとき:

router.get('/get/:fileName',function(req,res){
    res.sendFile('/file_path/'+req.params.fileName)
});

投稿されたコードと実装に基づきます。ダウンロードする必要があるファイルは数が限られ、既知のファイルです。

「file1.dat」と「file2.dat」の2つのファイルがあると仮定します

以下のようにAPIを呼び出すことができますか?

  1. http://yourapi.com/get/file1.dat
  2. http://yourapi.com/get/file2.dat

私は何かを逃していますか?

編集2:

その場合は、sendFileを使用する代わりにres.attachmentを使用する代わりに、これで問題が解決すると思います。

app.get('/get/myfile',function(req,res){
        res.attachment('/file.txt');
        res.end('Downloaded', 'UTF-8')
});