为mongodb网站expressjs存储图像的最佳方法是哪种?

时间:2019-05-03 04:43:52

标签: node.js mongodb image express

我是新快递,nodejs,mongodb。我正在建立一家服装店的网站。他们希望经常上传图像,也许每两天就会上传新图像,并且这些图像需要快速显示在网站上,即缩略图。单击图像将显示产品的详细信息,等等。

我的问题是存储图像的最佳方法是什么?

  1. 将图像存储到硬盘中,然后将绝对路径存储到数据库mongodb中吗?
  2. 将图像以二进制/ base64格式存储到数据库mongodb中吗?

如何将图像快速加载到网站中?

谢谢

2 个答案:

答案 0 :(得分:1)

我们将图像存储在哪里?

MongoDB中的解决方案#1

因此,第一个解决方案是将图像存储在MongoDB内部。它可以容纳图像文件或任何文件类型。因此,您可以获取文件并将其绑定到MongoDB内部的记录,然后将其直接保存到数据库中。

通过这种方法,可以将特定服装的描述页面与其相应的图像联系起来变得容易,因为您可以将该图像直接嵌入到该页面的开发中,并且客户会对该方法感到满意,因为当用户检索到该页面时,图片随附该服装的详细说明页面。

这就是一种可能的解决方案,只需拍摄图像并将其直接存储到MongoDB中即可。

但是,我建议这是一个不好的方法。这样做的原因是,您可以告诉客户是否存在回退,因为他们通常会根据其Mongo副本使用的存储量来为Mongo实例付费。

因此,他们用尽的存储空间越多,他们每月支付的费用就越多。

例如,上一次我检查MLab的使用时,他们每GB收取15美元。因此,托管1GB图像所需的客户费用为$ 15。

对于另一个电子商务网站,我们正在谈论3GB easy,它或多或少地转换为330张图像,平均每月15美元。

因此,如果他们的项目经理中的一位每天上载一件新衣服,我们将很快讨论巨额费用。

因此,我个人认为直接在MongoDB中存储任何类型的文件确实不是一种选择,因为这会导致非常昂贵的成本。

这只是一种可能的解决方案。

连接到服务器的高清解决方案#2

因此,让我们看一下您可能会使用的第二种解决方案。您可能使用与Express服务器捆绑在一起的硬盘驱动器。因此,当将此应用程序部署到诸如Heroku,Digital Ocean,Linode或AWS的某些云环境中时,通常会获得一个与应用程序关联的硬盘驱动器。

因此,也许您拍摄图像并将其放置在本地硬盘驱动器中。这种方法是绝大多数在线帖子和文章所倡导的:

How to upload, display and save images using node.js and express

https://appdividend.com/2019/02/14/node-express-image-upload-and-resize-tutorial-example/

https://medium.com/@nitinpatel_20236/image-upload-via-nodejs-server-3fe7d3faa642

就我上面收集的三个而言,您就有一个相当强大的蓝图可以开始使用。

每个人都说要拿走文件并将其保存到本地硬盘中。在这篇特别的文章中:

https://alligator.io/nodejs/uploading-files-multer-express/

他们正在显示以下代码:

const storage = multer.diskStorage({
  destination: 'some-destination',
  filename: function (req, file, callback) {
    //..
  }
});

他们正在使用名为multer的图像上传库,该库提供diskStorage()引擎,用于将图像上传到磁盘。

因此,这是整个开发社区都认同的一种方法。

在一对一映射的情况下,这是一种好方法。

当我们有多台计算机时,这种方法的问题开始出现。

例如,如果您在Digital Ocean或Linode上托管了多台计算机,而每个环境都是一个单独的实例。

如果您将所有图像都存储在随附的硬盘驱动器中,然后开始扩大服务器规模,它们将各自具有各自的硬盘驱动器。

因此,您可能有一个通过负载均衡器发出的请求,负载均衡器决定将请求发送到哪里,如下图所示:

enter image description here

因此,上述体系结构的问题是,如果映像被保存到两个硬盘驱动器之一中,然后稍后出现访问该映像的请求,但是想象该请求被路由到另一个Express服务器。不存在图像的其他硬盘驱动器。

当您开始使用服务提供商(例如Linode或Digital Ocean)时,就会出现此问题,在服务器和硬盘驱动器之间具有一对一的映射。

如果这是您现在所需要的,这是一个短期解决方案,但是一旦该应用程序开始扩展,它将成为一个问题。

外部数据存储区中的解决方案#3

第三种解决方案是我过去在React with Node应用程序和Ruby on Rails应用程序中使用的解决方案。实际上,我在Ruby on Rails产品组合网站上使用的是该解决方案,它位于Heroku平台上。

因此,当图像上传后,而不是Express API尝试像本地存储在其自己的硬盘上一样在本地存储文件,它将获取图像并使用外部数据存储来保存应用程序中所有不同的图像。 / p>

我在我的投资组合网站上使用的东西以及我在带有React应用程序的Node上使用的东西是Amazon S3,但同时也存在Azure File Storage和Google Cloud Storage。这些系统可容纳大量数据,并且可以是您可能想到的任何类型的文件。不仅是您所需要的图像,还包括视频文件,音频文件等。

使用S3可以拥有的存储量没有上限,但是您不必使用S3,但是它现在被视为行业标准,但是您可以轻松地使用Azure和Google云。

我认为您的客户会喜欢这种解决方案的好处,Amazon S3每月向您收取每千兆字节2便士的存储费用。

答案 1 :(得分:1)

我认为选项1是最佳选择。但是,我强烈建议与S3一起使用AWS cloudfront之类的服务:这将提高图像加载速度,并且存储成本确实很低。

也就是说,您可以只存储图像链接或密钥,然后在前端调用URL参考。

感兴趣的链接