使用ExpressJS上传后将文件存储到Mongo的GridFS中

9
我已经开始使用expressJS构建REST api。由于我对node不熟悉,请您耐心等待。我希望能够让用户通过向/upload路线发送请求,直接将文件上传到Mongo的GridFS。
根据我在expressJS文档中所了解的,req.files.image对象在上传后在路线中可用,其中也包括路径和文件名属性。但是,我该如何精确地读取图像数据并将其存储到GridFS中呢?
我已经查看了gridfs-stream,但我无法将它们联系起来。我首先需要读取文件,然后使用该数据进行writestream pipe吗?还是我可以只使用来自express的文件对象,并使用这些属性构建writestream?任何指针都将不胜感激!
1个回答

30

这是一个简单的演示:

var express = require('express');
var fs      = require('fs');
var mongo   = require('mongodb');
var Grid    = require('gridfs-stream');
var db      = new mongo.Db('test', new mongo.Server("127.0.0.1", 27017), { safe : false });

db.open(function (err) {
  if (err) {
    throw err;
  }
  var gfs = Grid(db, mongo);
  var app = express();

  app.use(express.bodyParser());
  app.post('/upload', function(req, res) {
    var tempfile    = req.files.filename.path;
    var origname    = req.files.filename.name;
    var writestream = gfs.createWriteStream({ filename: origname });
    // open a stream to the temporary file created by Express...
    fs.createReadStream(tempfile)
      .on('end', function() {
        res.send('OK');
      })
      .on('error', function() {
        res.send('ERR');
      })
      // and pipe it to gfs
      .pipe(writestream);
  });

  app.get('/download', function(req, res) {
    // TODO: set proper mime type + filename, handle errors, etc...
    gfs
      // create a read stream from gfs...
      .createReadStream({ filename: req.param('filename') })
      // and pipe it to Express' response
      .pipe(res);
  });

  app.listen(3012);
});

我使用 httpie 来上传文件:

http --form post localhost:3012/upload filename@~/Desktop/test.png

如果文件已上传,您可以检查您的数据库:

$ mongofiles list -d test
connected to: 127.0.0.1
test.png    5520

你也可以再次下载它:

http --download get localhost:3012/download?filename=test.png

这正是我正在寻找的,非常感谢!你有没有偶然之间对此有进一步文档来源? - Maarten
3
谢谢,这真的帮了我很多。对于那些使用Mongoose的人,你需要做出的唯一更改是:var gfs = Grid(db, mongoose.mongo)。 - Mike Pateras
@MikePateras 感谢您的提示,我很快就会将GridFS与Mongoose结合使用,这将节省我一些查找的时间 ;) - robertklep
我正在按照下载代码的步骤进行操作,但是无法正常工作。有完整可用的代码示例吗? - vinesh
@vinesh,这是一个旧答案了,也许你可以提出一个新问题,描述你具体的问题? - robertklep
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接