3

我目前正在使用 Sails.js 构建网络,并陷入从 GridFS 检索图像文件中。我已经使用 skipper-gridfs 成功地将文件上传到我的 mongo gridfs。我不知道以正确的方式显示文件(我是 Sails.js 和 Node 系统的新手)

这是我从 gridfs 中检索图像文件的代码,类似于 FileController.js(我使用的是 gridfs-stream):

show: function  (req, res, next) {
    var mongo = require('mongodb');
    var Grid = require('gridfs-stream');
    var buffer="";

    // create or use an existing mongodb-native db instance
    var db = new mongo.Db('testDb', new mongo.Server("192.168.0.2", 27017), {safe:true});
    var gfs = Grid(db, mongo);

    // streaming from gridfs
    var readstream = gfs.createReadStream({
      filename: 'e1ecfb02-e095-4e2f.png'
    });

    //check if file exist
    gfs.exist({
      filename: 'e1ecfb02-e095-4e2f.png'
    }, function (err, found) {
      if (err) return handleError(err);
      found ? console.log('File exists') : console.log('File does not exist');
    });

    //buffer data
    readstream.on("data", function (chunk) {
        buffer += chunk;
        console.log("adsf", chunk);
    });

    // dump contents to console when complete
    readstream.on("end", function () {
        console.log("contents of file:\n\n", buffer);
    });     
}

当我运行它时,控制台什么也没显示。也没有错误。

我应该如何解决这个问题?

附加问题:

  1. 将文件存储到本地磁盘/从本地磁盘读取文件而不是使用gridfs是否更好更容易?
  2. 我选择gridfs-stream 来检索gridfs 格式的文件是否正确?
4

2 回答 2

2

skipper-gridfs代码中,有一个“读取”方法接受fd值并返回与该值对应的所需文件。因此,您只需通过该方法从 mongo 中提取该文件并作为响应发送。它应该工作文件。

download: function (req, res) {
    var blobAdapter = require('skipper-gridfs')({
        uri: 'mongodb://localhost:27017/mydbname.images'
    });

    var fd = req.param('fd'); // value of fd comes here from get request
    blobAdapter.read(fd, function(error , file) {
        if(error) {
            res.json(error);
        } else {
            res.contentType('image/png');
            res.send(new Buffer(file));
        }
    });
}

我希望它有帮助:)

附加问题:

  1. 是的,使用 gridfs 在性能和效率上都更好。通常 mongodb 对于二进制文件可能有 16MB 的限制,但是使用 gridfs 你可以存储任何大小的文件,它将它们分成块并存储它们。

  2. 检索已在上面显示。

于 2015-01-25T17:38:08.267 回答
0

您现在可以在sails 中使用skipper-gridfs来管理上传/下载。

var blobAdapter = require('skipper-gridfs')({uri: 'mongodb://jimmy@j1mtr0n1xx@mongo.jimmy.com:27017/coolapp.avatar_uploads' });

上传:

req.file('avatar')
.upload(blobAdapter().receive(), function whenDone(err, uploadedFiles) {
  if (err) return res.negotiate(err);
  else return res.ok({
    files: uploadedFiles,
    textParams: req.params.all()
  });
});

下载

blobAdapter.read(filename, callback);

请记住,一旦您将文件上传到 mongo,文件名就会改变,您必须使用第一个响应中返回的文件名。

于 2014-10-30T16:24:13.583 回答