从MongoDB检索/发布图像(猫鼬)

时间:2014-08-02 04:46:55

标签: javascript node.js mongodb

我过去一直在尝试使用mongodb中的图像。由于每个文档的16mb大小限制,我一直在寻找的每个地方都说使用GridFS。但是,要存储的每个文档Id都是<16mb。我目前像这样存储它

var testChamp = new Champion ({
    name: "Aatrox",
    img: fs.readFileSync("D:/CounterMe/Aatrox_0.jpg"),
    contentType: "jpg"
});
testChamp.save(function() {
    console.log("Saved");
}) 

在我的架构中:

name: String,
img: Buffer,
contentType: String `

在mongoshell中查找这些信息会在cmd中带来大量的行,所以我不确定我是否正确存储它。如果我,我不知道如何将其插入我的HTML。我知道如何检索名称,将其作为对象传递:

app.get("/", function(req, response) {
    Champion.find(function(err, champs) {            
        response.render("index", {
        champ: champs[0]
        });            
    });
});

然而,一旦我检索到冠军[0] .img,我不知道如何处理它。我该如何将img传递给我的HTML?任何帮助将不胜感激,我目前非常难过。

2 个答案:

答案 0 :(得分:2)

你真的不应该尝试用HTML呈现。我已经看过方法,而且一般都很糟糕,并且有充分的理由。

浏览器实现缓存,因此任何&#34;图像&#34;它之前已检索到将保存在该缓存中。但如果你在某种程度上试图嵌入&#34;那个图像数据(例如通过Base64编码)你基本上丢弃了缓存功能并导致每个请求都发送数据。

如果你必须以这种方式在MongoDB中存储图像,那么你的API中应该有一个单独的端点,它将返回基本上只是图像的东西。所以提出所有请求&#34;看起来像&#34;他们只是从网络服务器获取图像。

首先更改您的数据,以反映&#34;文件名&#34;:

var testChamp = new Champion ({
    name: "aatrox.jpg",
    img: fs.readFileSync("D:/CounterMe/Aatrox_0.jpg"),
    contentType: "image/jpg"
});

然后你会得到这样的控制器代码:

app.get("/images/:image", function(req,res) {
    Champion.findOne({ "name": req.param.image },function(err,champ) {
       res.set("Content-Type", champ.contentType);
       res.send( champ.img );
    });
});

在模板中,您只需像往常一样参考图像的网址。您可以添加它,甚至可以存储内容长度等内容,并在响应头中设置它。在存储它们之前,您可以使用模块从通过另一个API点上传的图像中检测mime类型和大小。仔细看看这些。

这是有道理的,并且比在HTML中发送所有图像数据更有效。

答案 1 :(得分:0)

当我第一次进入Web开发时,我问了这个问题。回到5年后,我的方法肯定是错误的。我试图将自己的图像存储在mongodb中,当时我应该将它们存储在诸如S3的存储服务中,然后将指向这些图像的URL存储在mongodb中。希望这对遇到这个问题的人有所帮助!