首页 > 解决方案 > 为expressjs,mongodb站点存储图像的最佳方式是什么?

问题描述

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

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

  1. 将图像存储到硬盘中并将绝对路径存储到数据库mongodb中?
  2. 将图像作为二进制/base64 存储到数据库 mongodb 中?

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

谢谢

标签: node.jsmongodbimageexpress

解决方案


我们在哪里存储图像?

MongoDB中的解决方案#1

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

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

所以这是一种可能的解决方案,只需将图像直接存储到 MongoDB 中。

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

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

例如,我上次检查 MLab 的使用情况时,他们每 GB 收费 15 美元。因此,托管 1GB 的图像需要从您的客户口袋中掏出 15 美元。

对于另一个电子商务网站,我们谈论的是 3GB 简单,它或多或少地转换为 330 张图像,同样每月 15 美元。

因此,如果他们的一个项目经理每天上传一件新衣服,我们很快就会谈到巨大的成本。

所以,我个人认为直接在 MongoDB 中存储任何类型的文件类型确实不是一种选择,因为它会变得非常昂贵。

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

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

因此,让我们看一下您可能可以使用的第二种解决方案。您可能会使用绑定您的 Express 服务器的硬盘驱动器。因此,当此应用程序部署到 Heroku、Digital Ocean、Linode 或 AWS 等云环境时,您通常会获得与您的应用程序相关联的硬盘驱动器。

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

如何使用 node.js 和 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 上托管了多台机器,其中每个环境都是一个单独的实例。

如果您将所有图像存储在随附的硬盘驱动器中,然后您开始扩展您的服务器,那么它们每个都有自己独立的硬盘驱动器。

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

在此处输入图像描述

因此,上述架构的问题是,如果图像被保存到两个硬盘驱动器之一,然后请求进入访问相同的图像,但想象请求被路由到具有不同硬盘驱动器的另一个 Express 服务器图像不存在的地方。

当您开始使用像 Linode 或 Digital Ocean 这样的服务提供商时,就会出现这个问题,您在服务器和硬盘之间有一对一的映射。

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

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

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

因此,当图像被上传时,Express API 不会像在自己的硬盘上那样尝试将文件存储在本地,而是会获取图像并使用外部数据存储来保存来自应用程序的所有不同图像。

我用于我的投资组合网站以及我用于带有 React 应用程序的 Node 的是 Amazon S3,但也存在 Azure 文件存储和谷歌云存储。这些系统用于保存大量数据,它们可以是您可以想象的任何类型的文件。不仅仅是像你这样的图像,还有视频文件、音频文件等等。

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

我认为您的客户会欣赏此解决方案的好处,Amazon S3 每月向您收取每 GB 两美分的存储费用。


推荐阅读