GridFS 通过_id使用文件名下载来查找文件
GridFS find file by _id download with the name of the file
我想用multer和gridfs在express/mongodb中发布一个文件。
这个文件在前端用一个链接,如果我点击它,我想显示文件的真实名称,例如"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;
我设法解决了我的问题,为了获得文件的正确名称,我必须在响应中设置一些东西,这个问题在stackoverflow上进一步解释了它:
相关问题
我上来了,然后稍微更改了一下我的代码,使其像这样,这是改进的代码:
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;
我希望这能为那些也因为同样的原因而陷入困境的人提供一些帮助,我要感谢之前阅读过这个问题的人。
相关文章:
- 如何在生成下载文件时显示加载动画
- 直接下载文件,而不是从window.open(url)
- 如何使用javascript或html下载PDF格式的填写表单
- 正在全局范围中查找JavaScript函数
- Javascript运行php文件,然后下载文件
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在单击href链接的同时下载文件
- 尽管链接成功并已成功下载,但未找到NPM模块
- 通过php页面中的js强制下载txt
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- es6 相当于下划线查找位置
- 使用angularjs向浏览器发送servlet响应(下载功能)
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 通过javascript下载文件时设置文件名
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 如何在Edge中下载图像/png数据URI
- 如何在不传递此信息的情况下查找被调用的元素
- GridFS 通过_id使用文件名下载来查找文件
- 如何在javascript中查找当前活动的下载
- 使用Angular.js查找正在进行的http get请求的下载状态