Измените имя файла на лету для загрузки
Я сохраняю пользовательские загрузки, переименовав его оригинальное имя в userID + '_' + new Date().getTime() + fileExt
. Я сохраняю свойства файла в коллекции mongodb
следующим образом:
{
name : String //generated name
, originalName : String //its original name
...
}
Теперь, когда пользователь запрашивает загрузку файла, я должен предоставить файл с его оригинальным именем (которое сохраняется в БД, поэтому нет проблем захватить его) пользователю.
Для следующего запроса
GET /users/:userId/uploads/:fileId?type=download
У меня есть этот обработчик
//the mongoose query
UserUpload.findById(req.params.fileId).exec(function(err, doc){
var fileLocation = __dirname + '/public/uploads/users/' + req.params.userId + '/' + doc.name;
if(req.query.type && req.query.type == 'download') {
// I don't know what should I do now
// Downloader.download(fileLocation, newName);
}
});
Я читаю wiki из node-static модуль но не мог понять, как выполнить эту работу?
2 ответа:
Я нашел ответ здесь: загрузите файл с сервера NodeJS, используя Express. Как с помощью express, так и без использования express.
Это слишком просто, если вы используете
Express
. Вот документация для res. download . Я не могу поверить, что решение - это всего лишь одна строка кода:
res.download('/path/to/file.ext', 'newname.ext');
Вот то, что я использую в одном из своих проектов, smil-это тип файла, который мне нужно загрузить, неважно. В этом проекте у меня есть DOWNLOAD_DIR в качестве глобальной переменной, которая содержит полный путь к папке Загрузки.
Это может заставить многих людей съежиться (особенно fileExistSync), но это только начало.
var DOWNLOAD_DIR = '/path/to/download', url = require('url'), http = require('http'), /* download IN_: file_url, url of the file to download OUT: 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); } }); }