node javascript node.js file express download

javascript - node - express npm



Descargue un archivo del servidor NodeJS usando Express (6)

¿Cómo puedo descargar un archivo que está en mi servidor a mi máquina accediendo a una página en un servidor nodeJS?

Estoy usando el ExpressJS y he estado intentando 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 extensión). Alguien me puede ayudar con eso?


Utilice res.download()

Transfiere el archivo a la ruta como un "archivo adjunto". Por ejemplo:

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


Actualizar

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

Respuesta antigua

En lo que respecta a su navegador, el nombre del archivo es solo ''descargar'', por lo que necesita darle más información usando otro encabezado HTTP.

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

También es posible que desee enviar un tipo mime como este:

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

Si quieres algo más en profundidad, aquí tienes.

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

Puede establecer el valor del encabezado a lo que desee. En este caso, estoy usando una biblioteca de tipo mime - node-mime , para comprobar cuál es el tipo mime del archivo.

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


Así es como lo hago:

  1. crea un archivo
  2. enviar archivo al cliente
  3. Remover archivo

Código:

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


En Express 4.x, hay un método attachment() para Response :

res.attachment(); // Content-Disposition: attachment res.attachment(''path/to/logo.png''); // Content-Disposition: attachment; filename="logo.png" // Content-Type: image/png


Para archivos estáticos como archivos PDF, documentos de Word, etc., solo use la función estática de Express en su configuración:

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

Y luego simplemente coloque todos sus archivos dentro de esa carpeta ''pública'', por ejemplo:

/public/docs/my_word_doc.docx

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

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


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