私が現在Herokuでホストしているアプリを使用すると、ユーザーは写真を送信できます。当初、私はそれらの写真をファイルシステムに保存することを考えていました。データベースに保存することは明らかに悪い習慣だからです。
ただし、Herokuには永続的なファイルシステムはなく、一時的なファイルシステムしかないようです。これは本当ですか?もしそうなら、写真や他のファイルの保存に関する私のオプションは何ですか?
私が現在Herokuでホストしているアプリを使用すると、ユーザーは写真を送信できます。当初、私はそれらの写真をファイルシステムに保存することを考えていました。データベースに保存することは明らかに悪い習慣だからです。
ただし、Herokuには永続的なファイルシステムはなく、一時的なファイルシステムしかないようです。これは本当ですか?もしそうなら、写真や他のファイルの保存に関する私のオプションは何ですか?
それは本当です。Herokuではクラウドアプリを作成できますが、これらのクラウドアプリは「永続的」ではありません。AmazonのEC2で複数回複製できるインスタンス(または「スラッグ」)です(そのため、Herokuではスケーリングが非常に簡単です)。アプリの新しいバージョンをプッシュすると、スラッグが再コンパイルされ、前のインスタンスでファイルシステムに保存したファイルはすべて失われます。
(Herokuであろうとなかろうと)最善の策は、ユーザーが送信した写真をCDNに保存することです。Herokuを使用していて、HerokuはAWSを使用しているため、オプションでCloudFrontを有効にしてAmazonS3をお勧めします。
これは、Herokuの一時的な「制限」を回避するだけでなく、CDNがはるかに高速であり、Webアプリとユーザーエクスペリエンスに優れたサービスを提供するため、有益です。
使用しているテクノロジーによっては、アップロードをS3(Amazonのストレージサービス)にストリーミングするのが最善の策です。クライアントライブラリを使用してS3と対話し、ファイルの投稿と取得を簡単にすることができます。BotoはPythonのクライアントライブラリの例です。これらはすべての一般的な言語に存在します。
もう1つ覚えておくべきことは、Herokuファイルシステムも共有されていないということです。これは、アップロードを処理するアプリケーションと同じアプリケーション(たとえば、ワーカープロセスではなく)を使用してファイルをS3に配置する必要があることを意味します。可能であれば、アップロードをメモリにロードしてみてください。ディスクに書き込んだり、S3に直接投稿したりしないでください。これにより、アップロードの速度が向上します。
HerokuはAWSでホストされているため、S3へのストリームは非常に高速で行われます。ローカルで開発するときは、このことを覚えておいてください。