2016-04-27 4 views
2

Я хочу опубликовать файл в express/mongodb с multer и gridfs.GridFS найти файл по _id скачать с именем файла

Этот файл подключается во внешнем интерфейсе с помощью и, если я нажимаю на него, я хочу отобразить реальное имя файла, хотя, например, «example.pdf», а не: id.pdf. Прямо сейчас публикация работ полностью прекрасна. Я также могу сохранить исходное имя файла, но при получении файла, нажав на ссылку, имя файла больше не является оригиналом. Даже если я попытаюсь установить его раньше.

Вот мои две подпрограммы для ГЭТ и пост:

var router = require('express').Router(); 
 
var mongoose = require('mongoose'); 
 
var conn = mongoose.connection; 
 
var Grid = require('gridfs-stream'); 
 
Grid.mongo = mongoose.mongo; 
 
var gfs = Grid(conn.db); 
 
var fs = require('fs'); 
 

 
router.post('/', function(req, res) { 
 
    var dirname = require('path').dirname(__dirname); 
 
    var filename = req.file.filename; 
 
    var path = req.file.path; 
 

 
    var type = req.file.mimetype; 
 
    var read_stream = fs.createReadStream(dirname + '/' + path); 
 

 
    var writestream = gfs.createWriteStream({ 
 
     _id: filename, 
 
    'filename': req.file.originalname, 
 
    mode: 'w', 
 
    content_type: type 
 
    }); 
 
    read_stream.pipe(writestream); 
 

 
    writestream.on('close', function (file) { 
 
    res.status(200).json({'filename': filename}); 
 
    }); 
 
}); 
 

 
router.get('/:id',function(req , res) { 
 
    var file_id = req.params.id; 
 

 
    gfs.files.find({_id: file_id}).toArray(function (err, files) { 
 
    if (err) { 
 
     res.json(err); 
 
    } 
 
    if (files.length > 0) { 
 
     var mime = files[0].contentType; 
 
     var filename = files[0].filename; 
 
     res.set('Content-Type', mime); 
 
     res.set('originalname', filename); 
 
     var read_stream = gfs.createReadStream({_id: file_id}); 
 
     read_stream.pipe(res); 
 
    } else { 
 
     res.json('File Not Found'); 
 
    } 
 
    }); 
 
}); 
 

 
module.exports = router;

ответ

1

мне удалось решить мою проблему, чтобы получить правильное имя файла, который я должен был установить что-то в ответ на этот вопрос на StackOverflow объясняет далее:

related question

я придумал то изменить немного, чтобы он, как этот код, вот усовершенствованный код:

var router = require('express').Router(); 
 
var mongoose = require('mongoose'); 
 
var conn = mongoose.connection; 
 
var Grid = require('gridfs-stream'); 
 
Grid.mongo = mongoose.mongo; 
 
var gfs = Grid(conn.db); 
 
var fs = require('fs'); 
 

 
router.post('/', function(req, res) { 
 
    var dirname = require('path').dirname(__dirname); 
 
    var filename = req.file.filename; 
 
    var path = req.file.path; 
 
    var type = req.file.mimetype; 
 
    var read_stream = fs.createReadStream(dirname + '/' + path); 
 

 
    var writestream = gfs.createWriteStream({ 
 
     _id: filename, 
 
    'filename': req.file.originalname, 
 
    mode: 'w', 
 
    content_type: type 
 
    }); 
 
    read_stream.pipe(writestream); 
 

 
    writestream.on('close', function (file) { 
 
    res.status(200).json({'filename': filename}); 
 
    }); 
 
}); 
 

 
router.get('/:id',function(req , res) { 
 
    var file_id = req.params.id; 
 

 
    gfs.files.find({_id: file_id}).toArray(function (err, files) { 
 
    if (err) { 
 
     res.json(err); 
 
    } 
 
    if (files.length > 0) { 
 
     var mime = files[0].contentType; 
 
     var filename = files[0].filename; 
 
     res.set('Content-Type', mime); 
 
     res.set('Content-Disposition', "inline; filename=" + filename); 
 
     var read_stream = gfs.createReadStream({_id: file_id}); 
 
     read_stream.pipe(res); 
 
    } else { 
 
     res.json('File Not Found'); 
 
    } 
 
    }); 
 
}); 
 

 
module.exports = router;

Я надеюсь, что это обеспечивает некоторую помощь тех, кто также застревают из-за той же самой причине, и я хочу поблагодарить тех, кто прочитал вопрос раньше.