Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从MongoDB(mongoose)检索/发布图像_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript 从MongoDB(mongoose)检索/发布图像

Javascript 从MongoDB(mongoose)检索/发布图像,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,过去一段时间,我一直在尝试使用mongodb中的图像。由于每个文档都有16mb的大小限制,我一直在寻找的每个地方都说使用GridFS。但是,每个要存储的文档Id都是您确实不应该尝试用HTML呈现的。我见过很多方法,它们通常都很糟糕,有一个很好的理由 浏览器实现一个缓存,因此它以前检索到的任何“图像”都将保存在该缓存中。但是,如果您试图以某种方式“嵌入”该图像数据(例如,通过Base64编码),那么您基本上放弃了该缓存功能,并导致该数据随每个请求一起发送 如果您必须以这种方式在MongoDB中存储

过去一段时间,我一直在尝试使用mongodb中的图像。由于每个文档都有16mb的大小限制,我一直在寻找的每个地方都说使用GridFS。但是,每个要存储的文档Id都是您确实不应该尝试用HTML呈现的。我见过很多方法,它们通常都很糟糕,有一个很好的理由

浏览器实现一个缓存,因此它以前检索到的任何“图像”都将保存在该缓存中。但是,如果您试图以某种方式“嵌入”该图像数据(例如,通过Base64编码),那么您基本上放弃了该缓存功能,并导致该数据随每个请求一起发送

如果您必须以这种方式在MongoDB中存储图像,那么您的API中应该有一个单独的端点,它将返回基本上只是一个图像的内容。因此,让所有请求“看起来”像是从web服务器获取图像

首先稍微更改数据以反映“文件名”:

然后您将拥有如下控制器代码:

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 );
    });
});
在模板中,您只需像通常一样引用图像的URL。您可以将其添加到响应头中,甚至可以存储内容长度之类的内容,并将其设置在响应头中。在存储之前,您可以使用一些模块从通过另一个API点上传的图像中检测mime类型和大小。看看这些


这是有意义的,并且比在HTML中发送所有图像数据要高效得多。

您真的不应该尝试在HTML中呈现。我见过很多方法,它们通常都很糟糕,有一个很好的理由

浏览器实现一个缓存,因此它以前检索到的任何“图像”都将保存在该缓存中。但是,如果您试图以某种方式“嵌入”该图像数据(例如,通过Base64编码),那么您基本上放弃了该缓存功能,并导致该数据随每个请求一起发送

如果您必须以这种方式在MongoDB中存储图像,那么您的API中应该有一个单独的端点,它将返回基本上只是一个图像的内容。因此,让所有请求“看起来”像是从web服务器获取图像

首先稍微更改数据以反映“文件名”:

然后您将拥有如下控制器代码:

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 );
    });
});
在模板中,您只需像通常一样引用图像的URL。您可以将其添加到响应头中,甚至可以存储内容长度之类的内容,并将其设置在响应头中。在存储之前,您可以使用一些模块从通过另一个API点上传的图像中检测mime类型和大小。看看这些


这是有意义的,而且比在HTML中发送所有图像数据要高效得多。

我第一次进入web开发时问过这个问题。5年后再回头看,我的方法肯定是错误的。我试图将我的图像本身存储在mongodb中,而我本应该将它们存储在像S3这样的存储服务中,然后将这些图像的URL存储在mongodb中。希望这能帮助遇到这种情况的人

我刚开始从事web开发时问了这个问题。5年后再回头看,我的方法肯定是错误的。我试图将我的图像本身存储在mongodb中,而我本应该将它们存储在像S3这样的存储服务中,然后将这些图像的URL存储在mongodb中。希望这能帮助遇到这种情况的人

这可能会有帮助这可能会有帮助是这些模块中的一个GridFS吗?@user3851102 GridFS是一个完全不同的东西。它的目的是存储大于16MB BSON限制的文档。它是一个驱动程序规范,而不是任何形式的模块或软件。有很多错误的信息说你使用GridFS来存储图像。这都是假的。在16MB下,只需像您现在这样在MongoDB中存储和检索图像数据并没有什么问题。只是不要尝试嵌入HTML响应,因为这是不好的。对不起,我有点搞不清楚嵌入HTML响应是什么意思。你能详细解释一下吗?@shamelabdullah你的问题是如何在模板中渲染图像。我的回答是,不要在模板中尝试渲染,只需从标准URL返回图像数据。你的模板内容和图像应该在单独的请求中提供。好的,这就澄清了很多。我只是理解了这个信息。只是有点困惑,你是这些模块中的一个吗?@user3851102 GridFS是一个完全不同的东西。它的目的是存储大于16MB BSON限制的文档。它是一个驱动程序规范,而不是任何形式的模块或软件。有很多错误的信息说你使用GridFS来存储图像。这都是假的。在16MB下,只需像您现在这样在MongoDB中存储和检索图像数据并没有什么问题。只是不要尝试嵌入HTML响应,因为这是不好的。对不起,我有点搞不清楚嵌入HTML响应是什么意思。你能详细解释一下吗?@shamelabdullah你的问题是如何在模板中渲染图像。我的回答是,不要在模板中尝试渲染,只需从标准URL返回图像数据。你的模板内容和图像应该在单独的请求中提供。好的,这就澄清了很多。我只是理解了这个信息。只是有点困惑你是对的,像S3这样的外部存储是正确的方法。在存储位置引用映像不仅更易于理解和编程,而且消除了将缓冲区转换为映像的CPU密集型工作。您是对的,像S3这样的外部存储是正确的方法。在存储位置引用图像不仅更容易理解和编程,而且消除了CPU密集型的移交工作
app.get("/", function(req, response) {
    Champion.find(function(err, champs) {            
        response.render("index", {
        champ: champs[0]
        });            
    });
});
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 );
    });
});