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