gpt4 book ai didi

javascript - GridFS 通过文件名下载_id 查找文件

转载 作者:行者123 更新时间:2023-11-29 19:13:41 25 4
gpt4 key购买 nike

我想用 multer 和 gridfs 在 express/mongodb 中发布一个文件。

该文件在前端与一个链接,如果我单击它,我想显示文件的真实名称,例如“example.pdf”而不是 :id.pdf。现在发布工作完全正常我也可以保存原始文件名,但是通过单击链接获取文件时,文件名不再是原始文件名。即使我之前尝试设置它。

下面是我的get和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;

最佳答案

我设法解决了我的问题,为了获得正确的文件名,我必须在响应中设置一些内容,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;

我希望这对那些因为同样的原因而卡住的人有所帮助,我想感谢那些之前阅读过这个问题的人。

关于javascript - GridFS 通过文件名下载_id 查找文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com