如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?
Posted
技术标签:
【中文标题】如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?【英文标题】:How to retrieve image file from Mongo using Sails.JS + GridFS? 【发布时间】:2014-11-08 20:59:55 【问题描述】:我目前正在使用 Sails.js 构建 Web,但被困在从 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);
);
当我运行它时,控制台什么也没显示。 也没有错误。
我应该如何解决这个问题?
补充问题:
-
将文件存储到本地磁盘/从本地磁盘读取文件是否比使用 gridfs 更好、更容易?
我选择 gridfs-stream 来检索 gridfs 格式的文件是否正确?
【问题讨论】:
【参考方案1】:您现在可以在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,文件名就会改变,您必须使用第一个响应中返回的文件名。
【讨论】:
'blobAdapter().receive()' 作为第一个参数是否正确?因为我不能使用那种模式。但是如果我使用 ( adapter: require('skipper-gridfs'), uri : 'mongodb://127.0.0.1:27017/app.media_uploads' , callback) 它可以接受文件。【参考方案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));
);
希望对你有帮助:)
其他问题:
是的,使用 gridfs 在性能和效率上都更好。通常 mongodb 对于二进制文件可能有 16MB 的限制,但是使用 gridfs 你可以存储任何大小的文件,它将它们分成块并存储。
上面已显示检索。
【讨论】:
以上是关于如何使用 Sails.JS + GridFS 从 Mongo 检索图像文件?的主要内容,如果未能解决你的问题,请参考以下文章