Télécharger un fichier à partir de NodeJS Server en utilisant Express

Comment puis-je télécharger un fichier présent sur mon serveur sur ma machine pour accéder à une page sur un serveur nodeJS?

J’utilise ExpressJS et j’ai essayé ceci:

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

Mais je ne peux pas obtenir le nom du fichier et le type de fichier (ou l’extension). Est-ce que quelqu’un peut m’aider avec cela?

Mettre à jour

Express a une aide pour que cela facilite la vie.

 app.get('/download', function(req, res){ var file = __dirname + '/upload-folder/dramaticpenguin.MOV'; res.download(file); // Set disposition and send it. }); 

Ancienne réponse

En ce qui concerne votre navigateur, le nom du fichier est simplement “download”, vous devez donc lui donner plus d’informations en utilisant un autre en-tête HTTP.

 res.setHeader('Content-disposition', 'attachment; filename=dramaticpenguin.MOV'); 

Vous pouvez également vouloir envoyer un type MIME comme celui-ci:

 res.setHeader('Content-type', 'video/quicktime'); 

Si vous voulez quelque chose de plus profond, voilà.

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

Vous pouvez définir la valeur de l’en-tête comme bon vous semble. Dans ce cas, j’utilise une bibliothèque de type mime – node-mime , pour vérifier le type MIME du fichier.

Une autre chose importante à noter ici est que j’ai changé votre code pour utiliser un readStream. C’est une bien meilleure façon de faire les choses, car l’utilisation d’une méthode avec «Sync» dans le nom est mal vue car le noeud est censé être asynchrone.

Utiliser res.download()

Il transfère le fichier sur le chemin en tant que «pièce jointe». Par exemple:

 var express = require('express'); var router = express.Router(); // ... router.get('/:id/download', function (req, res, next) { var filePath = "/my/file/path/..."; // Or format the path using the `id` rest param var fileName = "report.pdf"; // The default name the browser will use res.download(filePath, fileName); }); 
  • En savoir plus sur res.download()

Pour les fichiers statiques comme les PDF, les documents Word, etc., utilisez simplement la fonction statique d’Express dans votre configuration:

 // Express config var app = express().configure(function () { this.use('/public', express.static('public')); // <-- This right here }); 

Et puis, placez simplement tous vos fichiers dans ce dossier "public", par exemple:

 /https://stackoverflow.com/questions/7288814/download-a-file-from-nodejs-server-using-express/public/docs/my_word_doc.docx 

Et puis un ancien lien régulier permettra à l'utilisateur de le télécharger:

 My Word Doc 

Dans Express 4.x, il existe une méthode attachment() pour Response :

 res.attachment(); // Content-Disposition: attachment res.attachment('path/to/logo.png'); // Content-Disposition: attachment; filename="logo.png" // Content-Type: image/png 
 'use ssortingct'; var express = require('express'); var fs = require('fs'); var compress = require('compression'); var bodyParser = require('body-parser'); var app = express(); app.set('port', 9999); app.use(bodyParser.json({ limit: '1mb' })); app.use(compress()); app.use(function (req, res, next) { req.setTimeout(3600000) res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept,' + Object.keys(req.headers).join()); if (req.method === 'OPTIONS') { res.write(':)'); res.end(); } else next(); }); function readApp(req,res) { var file = req.originalUrl == "/read-android" ? "Android.apk" : "Ios.ipa", filePath = "/home/sony/Documents/docs/"; fs.exists(filePath, function(exists){ if (exists) { res.writeHead(200, { "Content-Type": "application/octet-stream", "Content-Disposition" : "attachment; filename=" + file}); fs.createReadStream(filePath + file).pipe(res); } else { res.writeHead(400, {"Content-Type": "text/plain"}); res.end("ERROR File does NOT Exists.ipa"); } }); } app.get('/read-android', function(req, res) { var u = {"originalUrl":req.originalUrl}; readApp(u,res) }); app.get('/read-ios', function(req, res) { var u = {"originalUrl":req.originalUrl}; readApp(u,res) }); var server = app.listen(app.get('port'), function() { console.log('Express server listening on port ' + server.address().port); }); 

Voici comment je le fais:

  1. créer un fichier
  2. envoyer un fichier au client
  3. effacer le fichier

Code:

 let fs = require('fs'); let path = require('path'); let myController = (req, res) => { let filename = 'myFile.ext'; let absPath = path.join(__dirname, '/my_files/', filename); let relPath = path.join('./my_files', filename); // path relative to server root fs.writeFile(relPath, 'File content', (err) => { if (err) { console.log(err); } res.download(absPath, (err) => { if (err) { console.log(err); } fs.unlink(relPath, (err) => { if (err) { console.log(err); } console.log('FILE [' + filename + '] REMOVED!'); }); }); }); };