admin管理员组文章数量:1410730
I want to post a file in express/mongodb with multer and gridfs.
This file gets linked in the frontend with an and if I click on it I want to display the realname of the file though, for example "example.pdf" and not :id.pdf. Right now posting works pletely fine I also can save the original filename, but when getting the file by clicking on the link, the filename isn't the original anymore. Even if I try to set it before.
Here are my two routines for get and post:
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;
I want to post a file in express/mongodb with multer and gridfs.
This file gets linked in the frontend with an and if I click on it I want to display the realname of the file though, for example "example.pdf" and not :id.pdf. Right now posting works pletely fine I also can save the original filename, but when getting the file by clicking on the link, the filename isn't the original anymore. Even if I try to set it before.
Here are my two routines for get and post:
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;
Share
asked Apr 27, 2016 at 13:54
FroZenViperFroZenViper
1,0511 gold badge8 silver badges11 bronze badges
1 Answer
Reset to default 4I managed to solve my problem, to get the correct name of the file I had to set something in the response, this question on stackoverflow explains it further:
related question
I came up then change my code a little to have it like this, here is the improved code:
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;
I hope this provides some help to the ones who also get stuck because of the same reason and I want to thank the ones who read through the question before.
本文标签: javascriptGridFS find file by id download with the name of the fileStack Overflow
版权声明:本文标题:javascript - GridFS find file by _id download with the name of the file - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744925000a2632540.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论