对于允许简单图片上传的网络应用程序,我应该如何存储图片?对文件系统与 cdn 感到困惑
For a web app that allows simple image uploads, how should I store the images? Confused about file system vs. cdn
每个搜索结果都说将图像存储在文件系统中,但将路径存储在数据库中,但我不确定 "file system" 的确切含义。这是否意味着您有类似的东西:
/public (assets)
/js
/css
/img
/app (frontend)
/server (backend)
你会直接上传到 /public/img 目录吗?
我记得我过去曾尝试使用托管在 Heroku 上的 Node.js 应用程序进行类似的操作,但它不允许我这样做。我必须设置 Amazon S3 并在那里上传图像,这让我很困惑。
使用 Amazon S3 之类的东西是通常的做法还是人们直接上传到 /img 目录(假设这是 "file system"?)而 Heroku 恰好不允许这可是其他主机呢?
您可能会找到帮助:
https://codeforgeek.com/2014/11/file-uploads-using-node-js/
我在 node.js 服务器文件中使用了 multer 来处理从前端上传。基本上我有一个 html 表单,可以将图像提交到服务器文件,然后由 multer 处理。这实际上导致它被保存在文件系统中(具体回答你的问题,是的,这是在你的项目文件结构中的 /img 目录之类的东西)。我的应用程序是 heroku 上的 运行,这个功能也在那里工作。但是,我不建议像这样使用文件系统来存储您的图像(我怀疑您是否有足够的 space 来存储大量 images/files)- 使用 AWS 存储或数据库会更好。
直接上传到主机文件系统通常不是最佳做法。这是像 S3 这样的服务如此受欢迎的原因之一。
如果您正在使用主机文件系统并且需要一个以上的服务器实例,文件系统将变得不同步。假设一个用户将 'foo.jpg' 上传到服务器 A (A/app/uploads),而另一个用户将 'bar.jpg' 上传到服务器 B (B/app/uploads)。当稍后请求这些图像中的任何一个时,请求有 50% 的失败几率,具体取决于负载平衡器将请求路由到服务器 A 还是服务器 B。
避免主机文件系统有几个附带的好处。例如,您可以将为您的应用提供服务的文件系统设置为只读以提高安全性。文件是一种状态形式,无状态 Web 服务器允许您做一些事情,例如吹走一个实例并部署另一个实例来接管它的工作。
我将模式描述为 "store the data in a blob storage service, store a pointer in your database"。上传的文件是 "blob" - 一旦它离开了用户的计算机和文件系统,它就真的是一个文件了吗? :) 在服务器上,文件系统可以存储"blob"。 S3 可以存储该 blob。在第一种情况下,您正在存储路径。在第二种情况下,您将 URL 存储到 S3 对象。数据库甚至可以存储该 blob(虽然完全不推荐...)
无论如何,要问的问题是:"what happens when I need two app servers to support my traffic?"。无论 blob 到哪里,两个应用程序服务器都需要访问它。
在您控制的数据中心内,可以通过多种方式跨服务器共享文件系统 - 网络附加存储(NFS 或 SMB 挂载卷)或存储区域网络(iSCSI、光纤通道)。由于基于云的 Infrastructure/Platform-as-a-Service 提供商中的 network/hardware 配置选项更加有限,事实上的标准是 S3,因为它便宜、可靠、易于使用,并且可以完全卸载服务器上的文件服务。
不过,对于 Heroku,您对文件系统没有太多控制权。而且,要知道每个测功机的文件系统都是 "ephemeral" - 当测功机重新启动时它会消失。当您的应用程序闲置时或每 24 小时(以先到者为准)会发生这种情况。所以这有点迫使选择。
最后一点 - S3 附带的好处是可以减轻服务器为 blob 提供服务的负担。您还可以将文件直接从浏览器存储到 S3,而无需通过您的应用程序进行路由(请参阅 https://devcenter.heroku.com/articles/s3-upload-node)。在这两种情况下的好处是,那些 downloads/uploads 可以占用应用程序的大量宝贵时间来处理非常死记硬背的事情。
每个搜索结果都说将图像存储在文件系统中,但将路径存储在数据库中,但我不确定 "file system" 的确切含义。这是否意味着您有类似的东西:
/public (assets)
/js
/css
/img
/app (frontend)
/server (backend)
你会直接上传到 /public/img 目录吗?
我记得我过去曾尝试使用托管在 Heroku 上的 Node.js 应用程序进行类似的操作,但它不允许我这样做。我必须设置 Amazon S3 并在那里上传图像,这让我很困惑。
使用 Amazon S3 之类的东西是通常的做法还是人们直接上传到 /img 目录(假设这是 "file system"?)而 Heroku 恰好不允许这可是其他主机呢?
您可能会找到帮助:
https://codeforgeek.com/2014/11/file-uploads-using-node-js/
我在 node.js 服务器文件中使用了 multer 来处理从前端上传。基本上我有一个 html 表单,可以将图像提交到服务器文件,然后由 multer 处理。这实际上导致它被保存在文件系统中(具体回答你的问题,是的,这是在你的项目文件结构中的 /img 目录之类的东西)。我的应用程序是 heroku 上的 运行,这个功能也在那里工作。但是,我不建议像这样使用文件系统来存储您的图像(我怀疑您是否有足够的 space 来存储大量 images/files)- 使用 AWS 存储或数据库会更好。
直接上传到主机文件系统通常不是最佳做法。这是像 S3 这样的服务如此受欢迎的原因之一。
如果您正在使用主机文件系统并且需要一个以上的服务器实例,文件系统将变得不同步。假设一个用户将 'foo.jpg' 上传到服务器 A (A/app/uploads),而另一个用户将 'bar.jpg' 上传到服务器 B (B/app/uploads)。当稍后请求这些图像中的任何一个时,请求有 50% 的失败几率,具体取决于负载平衡器将请求路由到服务器 A 还是服务器 B。
避免主机文件系统有几个附带的好处。例如,您可以将为您的应用提供服务的文件系统设置为只读以提高安全性。文件是一种状态形式,无状态 Web 服务器允许您做一些事情,例如吹走一个实例并部署另一个实例来接管它的工作。
我将模式描述为 "store the data in a blob storage service, store a pointer in your database"。上传的文件是 "blob" - 一旦它离开了用户的计算机和文件系统,它就真的是一个文件了吗? :) 在服务器上,文件系统可以存储"blob"。 S3 可以存储该 blob。在第一种情况下,您正在存储路径。在第二种情况下,您将 URL 存储到 S3 对象。数据库甚至可以存储该 blob(虽然完全不推荐...)
无论如何,要问的问题是:"what happens when I need two app servers to support my traffic?"。无论 blob 到哪里,两个应用程序服务器都需要访问它。
在您控制的数据中心内,可以通过多种方式跨服务器共享文件系统 - 网络附加存储(NFS 或 SMB 挂载卷)或存储区域网络(iSCSI、光纤通道)。由于基于云的 Infrastructure/Platform-as-a-Service 提供商中的 network/hardware 配置选项更加有限,事实上的标准是 S3,因为它便宜、可靠、易于使用,并且可以完全卸载服务器上的文件服务。
不过,对于 Heroku,您对文件系统没有太多控制权。而且,要知道每个测功机的文件系统都是 "ephemeral" - 当测功机重新启动时它会消失。当您的应用程序闲置时或每 24 小时(以先到者为准)会发生这种情况。所以这有点迫使选择。
最后一点 - S3 附带的好处是可以减轻服务器为 blob 提供服务的负担。您还可以将文件直接从浏览器存储到 S3,而无需通过您的应用程序进行路由(请参阅 https://devcenter.heroku.com/articles/s3-upload-node)。在这两种情况下的好处是,那些 downloads/uploads 可以占用应用程序的大量宝贵时间来处理非常死记硬背的事情。