Download a file from NodeJS Server using Express Download a file from NodeJS Server using Express express express

Download a file from NodeJS Server using Express


Update

Express has a helper for this to make life easier.

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

Old Answer

As far as your browser is concerned, the file's name is just 'download', so you need to give it more info by using another HTTP header.

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

You may also want to send a mime-type such as this:

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

If you want something more in-depth, here ya go.

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

You can set the header value to whatever you like. In this case, I am using a mime-type library - node-mime, to check what the mime-type of the file is.

Another important thing to note here is that I have changed your code to use a readStream. This is a much better way to do things because using any method with 'Sync' in the name is frowned upon because node is meant to be asynchronous.


Use res.download()

It transfers the file at path as an “attachment”. For instance:

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


For static files like pdfs, Word docs, etc. just use Express's static function in your config:

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

And then just put all your files inside that 'public' folder, for example:

/public/docs/my_word_doc.docx

And then a regular old link will allow the user to download it:

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