【问题标题】:GridFS find file by _id download with the name of the fileGridFS find file by _id 下载文件名
【发布时间】:2016-08-21 21:00:56
【问题描述】:

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

这个文件在前端用 an 链接,如果我点击它,我想显示文件的真实名称,例如“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;

【问题讨论】:

    标签: javascript file express multer gridfs-stream


    【解决方案1】:

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

    我希望这对那些因同样原因而陷入困境的人有所帮助,我要感谢之前阅读问题的人。

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2016-01-08
      • 2018-08-13
      • 2012-03-29
      • 2012-02-12
      • 2021-12-21
      相关资源
      最近更新 更多