mongodb - 上传后使用 ExpressJS 将文件存储在 Mongo 的 GridFS 中

标签 mongodb express gridfs

我已经开始使用expressJS构建REST api。我是节点新手,所以请耐心等待。我希望能够让用户使用/upload 路由的帖子将文件直接上传到 Mongo 的 GridFS。

根据我在expressJS文档中的理解,上传后的路由中可以使用req.files.image对象,其中还包括路径和文件名属性。但如何才能准确读取图像数据并将其存储到 GridFS 中呢?

我调查过gridfs-stream但我无法将结局连在一起。我是否需要首先读取文件,然后将该数据用于 writestream 管道?或者我可以只使用 Express 中的文件对象并使用这些属性来构造写入流吗?任何指示将不胜感激!

最佳答案

这是一个简单的演示:

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

关于mongodb - 上传后使用 ExpressJS 将文件存储在 Mongo 的 GridFS 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482233/

相关文章:

mongodb - 错误 NotRegistered flask-mongoengine 教程

java - MongoDb 3.0.1 java驱动程序GridFs错误

javascript - 带有 graphql 和 document.toObject() 的 mongodb _id

javascript - 服务器使用 node.js (express) 发送事件/事件源

css - 卡住顶栏(标题栏)

node.js - 在 PassportJS/ExpressJS 中获取 IP

添加已填充集合的新分片时,MongoDB 无法正确扩展

MongoDB GridFS VS 直接磁盘 IO

mongodb - 如何使用 mongodump 转储的数据?

javascript - 类型错误 : Cannot read property 'title' of undefined