我过去一直在尝试使用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?任何帮助将不胜感激,我目前非常难过。
答案 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中。希望这对遇到这个问题的人有所帮助!