web-dev-qa-db-fra.com

NodeJS sendFile avec nom de fichier en téléchargement

J'essaye d'envoyer le fichier au client avec ce code:

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

ça marche bien mais j'ai besoin que lorsque l'utilisateur télécharge ce fichier à partir de l'URL:

http://mynodejssite.com/get/myfile

le nom de fichier dans le navigateur doit être "other_file_name.dat" et non "myfile".

5
Massimo Caroccia

il existe une méthode spécialisée res.download

qui couvre tout pour vous;)

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

Ceci est ma solution:

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

et l'utiliser:

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

Merci à tous les aides :)

6
Massimo Caroccia

Si vous avez plusieurs itinéraires comme ci-dessous: "/ Get/monfichier1", "/ get/monfichier2", "/ get/monfichier

Pourquoi ne faites-vous pas un générique? qui peut gérer toutes les demandes et résoudra également le problème de votre lien (nom_download) Vous pouvez le faire comme ci-dessous

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

Editer après le commentaire (EDIT 1):

Désolé, je n'ai pas compris votre argument. Je suppose que si vous développez l’API backend, vous devez également pouvoir choisir l’URL, pas vrai?

Donner un exemple:

quand côté serveur est ceci: 

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

Basé sur votre code posté et sa mise en œuvre. Les fichiers à télécharger sont des fichiers finis et connus.

en supposant qu'il y ait 2 fichiers: "fichier1.dat" et "fichier2.dat"

vous pouvez appeler l'api comme ci-dessous à droite?

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

est-ce que je manque quelque chose?

EDIT 2:

Si tel est le cas, je pense que cela résoudrait votre problème, au lieu d'utiliser sendFile, utilisez res.attachment:

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