从GridFs(MongoDB)显示图像

我正在使用下面的代码来读取使用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); }); 

以上的输出是:

在这里输入图像说明

除非你真的需要将图像embedded页面,否则使用pipe道作为saintedlama的答案。

dHJvb3Blci5qcGVn是base64编码的string“trooper.jpeg”。 请确保您一开始就正确保存了二进制数据到GridFS。

您可以直接查询它并检查存储在数据库中的文件的内容。

您可以将GridFS读取stream传递给响应而无需缓冲:

 app.get('/picture', function(req, res) { // Set correct content type first res.contentType('image/png'); fs .createReadStream('/tmp/Disneygoofy2012.jpeg') .pipe(res); }); 

我想你的缓冲解决scheme的问题是,你只传递你从GridFS接收的第一个字节包到res.send。

 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); }); 

这是从网格获取图像的完美解决scheme