GridFS найти файл по _id скачать с именем файла
Я хочу опубликовать файл в Express / Mongodb с Multer и gridfs.
Этот файл связывается во внешнем интерфейсе с и, и если я нажимаю на него, я хочу отобразить реальное имя файла, например, "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 ответ
Мне удалось решить мою проблему, чтобы получить правильное имя файла, который я должен был указать в ответе, этот вопрос по stackru объясняет это далее:
Я подошел, затем немного изменил свой код, чтобы он был таким, вот улучшенный код:
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;
Я надеюсь, что это поможет тем, кто застрял по той же причине, и я хочу поблагодарить тех, кто прочитал вопрос раньше.