Change the file name on the fly for downloading Change the file name on the fly for downloading express express

Change the file name on the fly for downloading


I found the answer here : Download a file from NodeJS Server using Express . Both using express and without using express.

It is too simple if you are using Express. Here is the documentation for res.download. I can't believe that the solution is just one line of code :

res.download('/path/to/file.ext', 'newname.ext');


Here what I use in one of my project, smil is a type of file I need to download, nevermind it.In that project I have DOWNLOAD_DIR as global variable, which contain the full path to the download folder.

It may make a lot of people cringe (especcially the fileExistSync) but it s a start.

var DOWNLOAD_DIR = '/path/to/download',url = require('url'),http = require('http'),/*downloadIN_:            file_url,       url of the file to downloadOUT:            file_name,  full path to downloaded file, null if the file cound t be downloaded.    COM:        download a file, the file name will be the last part of the url (http://why.so/serious.txt => serious.txt).            WARNING: Do NOT follow redirections.*/function download(file_url, callback) {    var options = {host: url.parse(file_url).host, port: 80, path: url.parse(file_url).pathname},        file_name = url.parse(file_url).pathname.split('/').pop(),    //Creating the file        file = fs.createWriteStream(DOWNLOAD_DIR + file_name, {flags: 'w', encoding: 'binary'});    console.log('Downloading file from ' + file_url);    console.log('\tto ' + file_name);    http.get(options, function (res) {        res.pipe(file, {end: 'false'});        //When the file is complete        res.on('end', function () {            //Closing the file            file.end();            console.log('\t\tDownloaded '+ file_name);            callback(DOWNLOAD_DIR + file_name);        });    });    process.on('uncaughtException', function(err) {        console.log('Can t download ' + file_url + '\t(' + err + ')', false);        callback(null);    });}/*download_smil    IN_:        file_url,       url of the file to download    OUT:        file_name,  full path to downloaded file    COM:        Follow http redirection and then call download function to download it.            You can modify the cad function to use custom names.*/function download_smil(file_url, callback) {    function cad(link, callback) {        //Does the file already exist?        var file = url.parse(link).pathname.substr(url.parse(link).pathname.lastIndexOf('/') + 1),            pkmn;        pkmn = fs.existsSync(DOWNLOAD_DIR + '/' + file);        if (pkmn) {            //YES: callback            console.log('File ' + file + ' already exist, skipping');            callback(DOWNLOAD_DIR + file, true);        } else {            //NO: Download it            console.log('Will download ' + link);            download(link, callback);        }    }    //GET the page    http.get(file_url, function (res) {        var link;        //console.log('res.statusCode = ' + res.statusCode + ' res.headers.location = ' + res.headers.location);        //Check if it is a redirect        if (res.statusCode > 300 && res.statusCode < 400 && res.headers.location) {            //console.log('redirect');            //Check if the hostname is in the location            if (url.parse(res.headers.location).hostname) {                //console.log('The link to the smil is res.headers.location');                link = res.headers.location;                cad(link, callback);            } else {                //console.log('The link to the smil is url_parse(file_url).hostname + res.headers.location = ' + url_parse(file_url).hostname + res.headers.location);                link = url_parse(file_url).hostname + res.headers.location;                cad(link, callback);            }        } else {            //console.log('The url is good : ' + file_url);            cad(file_url, callback);        }    });}