哪个是为 expressjs、mongodb 站点存储图像的最佳方式?

jac*_*pop 20 image mongodb node.js express

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

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

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

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

谢谢

Dan*_*iel 43

我们在哪里存储图像?

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) {
    //..
  }
});
Run Code Online (Sandbox Code Playgroud)

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

所以这是整个开发社区都同意的一种方法。

在一对一映射的上下文中,这是一种很好的方法。

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

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

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

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

在此处输入图片说明

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

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

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

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

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

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

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

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

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