从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