229 votos

Descargue un archivo del Servidor NodeJS usando el Express

Probablemente una pregunta tonta, pero ¿cómo puedo descargar un archivo que está en mi servidor a mi máquina accediendo a una página en un servidor del nodo JS?

Estoy usando el ExpressJS y he estado probando esto:

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

Pero no puedo obtener el nombre del archivo y el tipo de archivo (o la extensión). ¿Alguien puede ayudarme con eso?

Muchas gracias.

418voto

loganfsmyth Puntos 25483

En lo que respecta a tu navegador, el nombre del archivo es sólo 'download', así que necesitas darle más información usando otro encabezado HTTP.

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

También puede enviar un tipo de mímica como esta:

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

Si quieres algo más profundo, aquí tienes.

var path = require('path');
var mime = require('mime');

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

Puedes ajustar el valor de la cabecera a lo que quieras. En este caso, estoy usando una biblioteca de tipo mimeo, https://github.com/bentomas/node-mime para comprobar cuál es el tipo de mímica del archivo.

Otra cosa importante a tener en cuenta aquí es que he cambiado su código para usar un readStream. Esta es una forma mucho mejor de hacer las cosas porque usar cualquier método con "Sync" en el nombre está mal visto porque se supone que el nodo es asíncrono.

Actualización

Express tiene un ayudante para que esto haga la vida más fácil.

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

10voto

jordanb Puntos 1

Para archivos estáticos como pdfs, Word docs, etc. usa la función estática de Express en tu configuración:

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

Y luego sólo tienes que poner todos tus archivos dentro de esa carpeta "pública", por ejemplo:

/public/docs/my_word_doc.docx

Y luego un viejo enlace regular permitirá al usuario descargarlo:

<a href="public/docs/my_word_doc.docx">My Word Doc</a>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X