显示来自GridFs(MongoDB)的图像

时间:2016-01-21 10:29:14

标签: javascript node.js mongodb mongoose gridfs-stream

我使用以下代码使用GridFs读取保存在MongoDB中的图像文件:

app.get('/picture', function(req, res) {

 var readstream = gfs.createReadStream({
    filename: 'trooper.jpeg'
 });

 readstream.on('data', function (data) {
  // We got a buffer of data...

 var buf2 = new Buffer(data).toString('base64'); 
 res.send(buf2.toString())
 console.log(buf2.toString());
 console.log(data);
});
  readstream.on('end', function () {
// File finished reading...
});

});

console.log(buff.toString()); 的输出是:

dHJvb3Blci5qcGVn

console.log(data); 的输出是:

<Buffer 74 72 6f 6f 70 65 72 2e 6a 70 65 67>

要显示图像,我这样做了:

<img src="data:image/jpeg;base64,dHJvb3Blci5qcGVn">

我无法从GridFs MongoDB中读取和显示html中的图像

更新

我试过这个:

app.get('/picture', function(req, res) {
res.contentType('image/jpeg');
var readstream = gfs.createReadStream('trooper.jpeg');
readstream.pipe(res);

});

以上的输出是:

enter image description here

3 个答案:

答案 0 :(得分:1)

除非您确实需要将图像嵌入到页面中,否则请使用saintedlama的答案。

dHJvb3Blci5qcGVn是base64编码的字符串“trooper.jpeg”。请确保您在第一次将二进制数据正确保存到GridFS。

您可以query it directly并检查数据库中存储的文件的内容。

答案 1 :(得分:0)

您可以将GridFS读取流传输到响应而不进行缓冲:

app.get('/picture', function(req, res) {
  // Set correct content type first
  res.contentType('image/png');

  fs
    .createReadStream('/tmp/Disneygoofy2012.jpeg')
    .pipe(res);
});

我猜你的缓冲解决方案的问题是你只将你从GridFS收到的第一个字节包传递给res.send。

答案 2 :(得分:0)

var Grid = require("gridfs-stream");
Grid.mongo = mongo; 

router.get("/:filename", function(req, res){ 
        gfs = Grid(db);
        var readstream = gfs.createReadStream({filename: req.params.filename}); 
        readstream.on("error", function(err){
            res.send("No image found with that title"); 
        });
        readstream.pipe(res);
    });

这是从gridfs获取图像的完美解决方案