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?

229
demandé sur KARTHIKEYAN.A 2011-09-03 00:18:57

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.

419
répondu loganfsmyth 2017-10-23 00:40:54

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);    
});
30
répondu Jossef Harush 2016-07-24 12:40:00

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>
10
répondu jordanb 2014-10-24 16:47:53

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
9
répondu Benoit Blanchon 2016-06-24 10:15:58
'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);
});
4
répondu KARTHIKEYAN.A 2017-04-14 18:47:27

Voici comment je le fais:

  1. Créer un fichier
  2. envoyer le fichier au client
  3. 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!');
      });
    });
  });
};
-1
répondu Vedran 2017-09-25 20:14:03