Node.js 对于允许简单图像上传的web应用程序,我应该如何存储图像?对文件系统和cdn感到困惑

Node.js 对于允许简单图像上传的web应用程序,我应该如何存储图像?对文件系统和cdn感到困惑,node.js,web-services,amazon-web-services,heroku,image-uploading,Node.js,Web Services,Amazon Web Services,Heroku,Image Uploading,每个搜索结果都说明了如何将图像存储在文件系统中,但将路径存储在数据库中,但我不确定“文件系统”到底是什么意思。这是否意味着你有类似于: /public (assets) /js /css /img /app (frontend) /server (backend) 你会直接上传到/public/img目录吗 我记得以前在Heroku上托管了一个Node.js应用程序,我尝试过类似的方法,但它不允许我这么做。我必须设置AmazonS3并将图像上传到那里,这导致了我的困惑

每个搜索结果都说明了如何将图像存储在文件系统中,但将路径存储在数据库中,但我不确定“文件系统”到底是什么意思。这是否意味着你有类似于:

/public (assets)
    /js
    /css
    /img
/app (frontend)
/server (backend)
你会直接上传到/public/img目录吗

我记得以前在Heroku上托管了一个Node.js应用程序,我尝试过类似的方法,但它不允许我这么做。我必须设置AmazonS3并将图像上传到那里,这导致了我的困惑


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

您可能会发现以下帮助:


我在node.js服务器文件中使用multer来处理前端的上传。基本上,我有一个html表单,可以将图像提交到服务器文件,然后由multer处理。这实际上导致它被保存在文件系统中(具体地回答您的问题,是的,这是指向项目文件结构中的/img目录)。我的应用程序在heroku上运行,这个功能也在heroku上运行。但是,我不建议使用文件系统来存储这样的图像(我怀疑您是否有足够的空间来存储大量图像/文件)-使用AWS存储或DB会更好。

您可能会发现以下帮助:


我在node.js服务器文件中使用multer来处理前端的上传。基本上,我有一个html表单,可以将图像提交到服务器文件,然后由multer处理。这实际上导致它被保存在文件系统中(具体地回答您的问题,是的,这是指向项目文件结构中的/img目录)。我的应用程序在heroku上运行,这个功能也在heroku上运行。但是,我不建议使用文件系统来存储这样的图像(我怀疑您是否有足够的空间存储大量图像/文件)-使用AWS存储或DB会更好。

直接上传到主机文件系统通常不是最佳做法。这就是像S3这样的服务如此流行的原因之一

如果您使用的是主机文件系统,并且需要一个以上的服务器实例,那么文件系统将变得不同步。假设一个用户将“foo.jpg”上传到服务器A(A/app/uploads),另一个用户将“bar.jpg”上传到服务器B(B/app/uploads)。当以后请求这些映像中的任何一个时,请求失败的概率为50%,这取决于负载平衡器是将请求路由到服务器a还是服务器B


避免使用主机文件系统有几个辅助好处。例如,您可以将为应用程序提供服务的文件系统设置为只读,以提高安全性。文件是状态的一种形式,无状态web服务器允许您执行诸如吹走一个实例并部署另一个实例以接管其工作之类的操作。

直接上载到主机文件系统通常不是最佳做法。这就是像S3这样的服务如此流行的原因之一

如果您使用的是主机文件系统,并且需要一个以上的服务器实例,那么文件系统将变得不同步。假设一个用户将“foo.jpg”上传到服务器A(A/app/uploads),另一个用户将“bar.jpg”上传到服务器B(B/app/uploads)。当以后请求这些映像中的任何一个时,请求失败的概率为50%,这取决于负载平衡器是将请求路由到服务器a还是服务器B


避免使用主机文件系统有几个辅助好处。例如,您可以将为应用程序提供服务的文件系统设置为只读,以提高安全性。文件是状态的一种形式,无状态web服务器允许您执行诸如吹走一个实例并部署另一个实例来接管其工作之类的操作。

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

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

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

不过,对于Heroku来说,您对文件系统没有太多控制权。而且,要知道,每个dyno的文件系统都是“短暂的”——当dyno重新启动时,它就会消失。当你的应用程序闲置时,或者每24小时一次,以先到者为准。这就迫使我们做出了一点选择


最后一点-S3附带了一个附带的好处,即减轻了为服务器上的blob提供服务的负担。您还可以直接从浏览器将文件存储到S3,而无需通过应用程序进行路由(请参阅)。这两种情况的好处都是,这些下载/上传可能会占用应用程序大量宝贵的时间来完成死记硬背的工作。

我将这种模式描述为“将数据存储在blob存储服务中,将指针存储在数据库中”。上传的文件是“blob”-一旦它离开了用户的计算机