我们将图像存储在哪里?
MongoDB 中的解决方案 #1
所以第一个解决方案是将图像存储在 MongoDB 中。它可以容纳图像文件或任何文件类型。因此,您可以获取一个文件并将其绑定到 MongoDB 中的一条记录,然后将其直接保存到您的数据库中。
通过这种方法,将特定服装的描述页面与其对应的图像联系起来变得很容易,因为您可以将此图像直接嵌入到该页面的开发中,并且您的客户会对这种方法感到满意,因为当用户检索图片附带的那件衣服的详细描述页面。
所以这是一种可能的解决方案,只需获取图像并直接存储到 MongoDB。
但是,我建议这是一种不好的方法。这样做的原因是,您可以告诉您的客户是否存在回退,因为他们通常会根据他们的 Mongo 副本使用的存储量来为他们的 Mongo 实例付费。
因此,他们使用的存储空间越多,他们每月支付的费用就越多。
例如,我上次检查 MLab 的使用情况时,他们收取每 GB 15 美元的费用。因此,托管 1GB 的图像需要从您的客户口袋中掏出 15 美元。
对于另一个电子商务网站,我们谈论的是 3GB 的简单存储空间,它或多或少地转换为 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 上托管了多台机器,其中每个环境都是一个单独的实例。
如果您将所有图像都存储在随附的硬盘中,然后您开始扩展您的服务器,那么它们每个都有自己独立的硬盘。
因此,您可能有一个通过负载均衡器传入的请求,而负载均衡器决定将请求发送到何处,如下图所示:
所以上述架构的问题是,如果图像被保存到两个硬盘驱动器之一,然后请求进入访问同一个图像,但想象请求被路由到另一个 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云。
我认为您的客户会欣赏此解决方案的好处,Amazon S3 每月向您收取每 GB 两美分的存储费用。