node.js - 对于一个允许简单图像上传的Web应用程序,我应该如何存储图像?对文件系统与 CDN 感到困惑

标签 node.js web-services amazon-web-services heroku image-uploading

每个搜索结果都说明了有关将图像存储在文件系统中但将路径存储在数据库中的信息,但我不确定“文件系统”的确切含义。这是否意味着你有类似的东西:

/public (assets)
    /js
    /css
    /img
/app (frontend)
/server (backend)

您会直接上传到/public/img 目录吗?

我记得过去曾使用 Heroku 上托管的 Node.js 应用程序尝试过类似的操作,但它不允许我这么做。我必须设置 Amazon S3 并上传图像,这让我感到困惑。

通常的做法是使用 Amazon S3 之类的东西,还是人们直接上传到/img 目录(假设这是“文件系统”?),而恰好 Heroku 不允许,但其他主机允许?

最佳答案

我将该模式描述为“将数据存储在 blob 存储服务中,将指针存储在数据库中”。上传的文件是“blob”——一旦它离开用户的计算机和文件系统,它真的就不再是文件了吗? :) 在服务器上,文件系统可以存储该“blob”。 S3 可以存储该 blob。在第一种情况下,您正在存储路径。在第二种情况下,您将 URL 存储到 S3 对象。数据库甚至可以存储该 blob(不过,根本不推荐......)

无论如何,要问的问题是:“当我需要两个应用服务器来支持我的流量时会发生什么?”。无论该 blob 去往何处,两个应用服务器都需要访问它。

在您控制的数据中心中,可以通过多种方式跨服务器共享文件系统 - 网络附加存储(NFS 或 SMB 安装卷)或存储区域网络(iSCSI、光纤 channel )。由于基于云的基础设施/平台即服务提供商的网络/硬件配置选项更加有限,事实上的标准是 S3,因为它便宜、可靠、易于使用,并且可以完全卸载服务器上的文件服务。

但是对于 Heroku,您对文件系统没有太多控制权。并且,要知道每个测功机的文件系统都是“短暂的”——当测功机重新启动时它就会消失。当您的应用程序空闲时或每 24 小时(以先到者为准)会发生这种情况。所以这有点迫使我们做出选择。

最后一点 - S3 具有附带的好处,可以减轻服务器提供 blob 的负担。您还可以从浏览器将文件直接存储到 S3,而无需通过应用程序路由(请参阅 https://devcenter.heroku.com/articles/s3-upload-node )。这两种情况的好处是,这些下载/上传可能会占用应用程序的大量宝贵时间来处理那些非常死记硬背的事情。

关于node.js - 对于一个允许简单图像上传的Web应用程序,我应该如何存储图像?对文件系统与 CDN 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342260/

相关文章:

android - 使用 Bosch 和 Strophe 将 ejabberd 集成到现有的 nodejs 应用程序中

javascript - requirejs:从网络服务加载脚本/模块

javascript - 无法从母版页的代码页中调用 Web 方法

amazon-web-services - 如何处理关系数据库中的AWS IOT流数据

amazon-web-services - 从 API 网关触发的 lambda 函数的最大预配置并发数应该是多少?

apache - 使用 S3/EC2 时删除 ".php"文件扩展名

node.js - 动态模块 : query with hash key only

javascript - 如何从 POST 读取数据、使用条件测试数据并发回响应

mysql - 遍历mysql表以填充Node中的数组

.net - 有没有一种方法可以在不修改服务方法的情况下保护 Web 服务?