我目前正在使用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);
});
}
当我跑步时,控制台什么都没显示。 也没有错误。
我该如何解决这个问题?
附加问题:
答案 0 :(得分:1)
在skipper-gridfs
代码中,有一个'read'方法接受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你可以存储任何大小的文件,它会将它们分块并存储起来。
检索已在上面显示。
答案 1 :(得分:0)
您现在可以在风帆中使用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,文件名就会改变,你必须使用第一个响应中返回的文件名。