2

multer と gridfs を使用して、express/mongodb にファイルを投稿したいと考えています。

このファイルはフロントエンドでリンクされ、それをクリックすると、ファイルの実際の名前が表示されます。たとえば、id.pdf ではなく「example.pdf」です。現在、投稿は完全に正常に機能しており、元のファイル名を保存することもできますが、リンクをクリックしてファイルを取得すると、ファイル名は元のものではなくなります。前に設定しようとしても。

get と post の 2 つのルーチンを次に示します。

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;

4

1 に答える 1

4

私は自分の問題を解決することができました。ファイルの正しい名前を取得するには、応答で何かを設定する必要がありました。

関連する質問

私は思いついたので、コードを少し変更してこのようにしました。改善されたコードは次のとおりです。

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;

これが同じ理由で立ち往生している人に役立つことを願っています。以前に質問を読んだ人に感謝したいと思います.

于 2016-05-03T08:39:52.380 に答える