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".
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");
});
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 :)
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?
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')
});