GridFS 通过_id使用文件名下载来查找文件

GridFS find file by _id download with the name of the file

本文关键字:下载 查找 文件 文件名 通过 id GridFS      更新时间:2023-09-26

我想用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;

我希望这能为那些也因为同样的原因而陷入困境的人提供一些帮助,我要感谢之前阅读过这个问题的人。