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