node.js - 如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?

标签 node.js mongodb sails.js gridfs gridfs-stream

我目前正在使用 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 检索文件是否正确?

最佳答案

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 你可以存储任何大小的文件,它将它们分成 block 并存储它们。

  2. 检索已如上所示。

关于node.js - 如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846272/

相关文章:

javascript - 如果在映射数组中,则将对象推送到选中 : true, 的新数组

angularjs - Node 应用程序中的请求超时

spring - 从 Spring/MongoDB findAndModify 返回新旧实体

node.js - 将 Autoprefixer 浏览器选项替换为 Browserslist 配置错误

mysql - 从刚插入的行中检索数据(MySql 和 Node.js)

bash - 如何检测 bash 脚本等待用户输入?

node.js - sailsjs 的 CSRF 问题

mongodb - 查询不等于 null 或空的地方

javascript - sails.js:枚举的模型定义 - 值的动态列表

reactjs - react + sails : Handling Routes