我目前在 Heroku 上托管的应用程序允许用户提交照片。最初,我正在考虑将这些照片存储在文件系统中,因为将它们存储在数据库中显然是不好的做法。
然而,Heroku 上似乎没有永久的文件系统,只有一个短暂的文件系统。这是真的吗?如果是的话,我在存储照片和其他文件方面有哪些选择?
我目前在 Heroku 上托管的应用程序允许用户提交照片。最初,我正在考虑将这些照片存储在文件系统中,因为将它们存储在数据库中显然是不好的做法。
然而,Heroku 上似乎没有永久的文件系统,只有一个短暂的文件系统。这是真的吗?如果是的话,我在存储照片和其他文件方面有哪些选择?
是真的。Heroku 允许您创建云应用程序,但这些云应用程序不是“永久的”——它们是可以在 Amazon 的 EC2 上多次复制的实例(或“slug”)(这就是为什么使用 Heroku 可以轻松进行扩展)。如果您要推送应用程序的新版本,那么 slug 将被重新编译,并且您在之前的实例中保存到文件系统的所有文件都将丢失。
您最好的选择(无论是在 Heroku 还是其他方式)是将用户提交的照片保存到 CDN。由于您在 Heroku 上,而 Heroku 使用 AWS,我推荐使用 Amazon S3,可选择启用 CloudFront。
这是有益的,不仅因为它绕过了 Heroku 的短暂“限制”,还因为 CDN 速度更快,将为您的 web 应用程序和用户体验提供更好的服务。
根据您使用的技术,您最好的选择可能是将上传流式传输到 S3(亚马逊的存储服务)。您可以通过客户端库与 S3 交互,以简化发布和检索文件。Boto 是 Python 的一个示例客户端库——它们适用于所有流行的语言。
要记住的另一件事是 Heroku 文件系统也不是共享的。这意味着您必须使用与处理上传的应用程序相同的应用程序将文件放入 S3(而不是说,一个工作进程)。如果可以,请尝试将上传内容加载到内存中,切勿将其写入磁盘并直接发布到 S3。这将提高您的上传速度。
因为 Heroku 托管在 AWS 上,所以到 S3 的流以非常高的速度发生。在本地开发时请记住这一点。