node.js - 为mongodb网站expressjs存储图像的最佳方法是哪一种?

标签 node.js mongodb image express

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

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

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

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

    谢谢

    最佳答案

    我们在哪里存储图像?

    MongoDB中的解决方案#1

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

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

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

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

    因此,他们用尽了更多的存储空间,便每月支付更多的钱。

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

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

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

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

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

    服务器上附加的高清解决方案#2

    因此,让我们看一下您可能会使用的第二种解决方案。您可能会使用 bundle 在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尝试像本地存储在其自己的硬盘上一样在本地存储文件,它将获取图像并使用外部数据存储区来保存应用程序中的所有不同图像。

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

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

    我想您的客户会喜欢这种解决方案的好处,Amazon S3每月向您收取每GB便士两个便士的存储费用。

    关于node.js - 为mongodb网站expressjs存储图像的最佳方法是哪一种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55963408/

    相关文章:

    python - MongoDB - 不存在字段的错误处理

    linux - 在同一台服务器上运行的 2 个 MongoDB 实例可以指向同一个数据文件夹吗?

    java - OpenCV 去除背景噪声和伪影

    node.js - Nodejs 中的 OTP 验证?

    javascript - Node.js HTTP 和 TCP 客户端连接

    javascript - 使用 Gulp Data 在 Gulp 中获取来自 Mongo 的数据

    c# - SqLite 中的存储图像占用的空间增加了 2 倍

    php imagecopyresampled 质量差

    node.js - 在 typescript 中保存 socket.io 对象的更多数据

    node.js - 类型错误 : Cannot read property 'mv' of undefined in Node. js