【问题标题】:Display images from GridFs (MongoDB)显示来自 GridFs (MongoDB) 的图像
【发布时间】:2016-04-27 13:06:20
【问题描述】:

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

});

上面的输出是:

【问题讨论】:

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


    【解决方案1】:

    除非您真的需要将图像嵌入页面,否则请按照 saintedlama 的回答使用管道。

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

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

    【讨论】:

    • 非常感谢您的回答。我不确定我是否正确保存了它。我发布了这个问题,其中包含我的文件上传代码以及图像。你能看看stackoverflow.com/questions/34904157/…
    • 是的,您保存的是文件名,而不是二进制有效负载。我在那里回答。
    【解决方案2】:
    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 获取图像的完美解决方案

    【讨论】:

    • 我可以将它用于 bson 文档中的普通图像吗?
    【解决方案3】:

    您可以直接将 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。

    【讨论】:

    • 首先我要说非常感谢您尝试回答我的问题并帮助我。我已经进行了您建议的更改。我相当肯定我做错了。请查看更新后的问题以了解我的更改和输出。如果你能帮助我解决这将是惊人的,因为我已经被困在这好几天了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-04-08
    • 2017-06-23
    • 2014-03-21
    • 2012-05-22
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多