Télécharger un fichier à partir du serveur NodeJS en utilisant Express
Comment puis-je télécharger un fichier qui se trouve dans mon serveur sur ma machine accédant à une page dans un serveur nodeJS?
J'utilise L'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 ). Quelqu'un peut-il m'aider?
6 réponses
Mettre à jour
Express a une aide pour cela rendre la vie plus facile.
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 juste '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 envoyer un type mime comme celui-ci:
res.setHeader('Content-type', 'video/quicktime');
Si vous voulez quelque chose de plus en profondeur, 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 d'en-tête à ce que vous voulez. Dans ce cas, je suis à l'aide d'un mime-type de la bibliothèque - nœud-mime, afin de 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 de n'importe quelle méthode avec 'Sync' dans le nom est mal vue car node est censé être asynchrone.
Utiliser res.download()
Il transfère le fichier à path 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);
});
- Lire plus sur
res.download()
Pour les fichiers statiques comme les fichiers 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 il suffit de mettre tous vos fichiers dans ce dossier 'public', par exemple:
/public/docs/my_word_doc.docx
Et puis un ancien lien régulier permettra à l'utilisateur de le télécharger:
<a href="public/docs/my_word_doc.docx">My Word Doc</a>
Dans Express 4.x, il y a une méthode attachment()
à Response
:
res.attachment();
// Content-Disposition: attachment
res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
'use strict';
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:
- Créer un fichier
- envoyer le fichier au client
- supprimer 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!');
});
});
});
};