Измените имя файла на лету для загрузки


Я сохраняю пользовательские загрузки, переименовав его оригинальное имя в 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 2

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