私のウェブサイトでは、ユーザーはプロフィール画像をアップロードできます。
これらの画像を保存する最良の方法を知りたかったのです。
私の考えは、単に専用のディレクトリです。イメージ名は user_id になります。
それは良い解決策ですか、それとももっと賢い解決策がありますか?
私のウェブサイトでは、ユーザーはプロフィール画像をアップロードできます。
これらの画像を保存する最良の方法を知りたかったのです。
私の考えは、単に専用のディレクトリです。イメージ名は user_id になります。
それは良い解決策ですか、それとももっと賢い解決策がありますか?
画像を保存するか、外部ソース (gravatar) を使用するかの 2 つのオプションがあります。
画像を保存する場合、これらの画像を公開したいですか、それとも非公開にしますか? それらが公開されている場合は、パブリック フォルダーに保存できます。
carrierwave
画像のアップロード、バージョン管理、および保存を処理するようなものを使用できます。
パブリックなものについては、uploader/model name/field name/id の場所の下にある public ディレクトリにファイルを保存します。これは、私の側の組織的な目的のためです。
優れたチュートリアルについては、http://railscasts.com/episodes/253-carrierwave-file-uploadsをご覧ください。
プライベート イメージの場合は、ストア ディレクトリをパブリック フォルダーの外部に設定し、ファイルを使用してコントローラー内にダウンロード アクションを作成します。この方法では、コントローラーのアクションを実行しない限り、ユーザーはファイルをダウンロードできません。承認 ( cancan
) があれば、ユーザーがその特定のファイルのダウンロード アクションにアクセスすることを許可または禁止できます (したがって、ある程度安全になります)。apache や nginx などの実稼働サーバーを使用する場合は、ファイルを送信するための適切なハンドラー (x_sendfile など) を設定してください。
小さなアプリケーションのディレクトリに画像を保存することは非常に一般的です。ただし、ここで考慮すべき点がいくつかあります。
多くのユーザーを想定していますか?100 万人のユーザーがいる場合、ディレクトリに全員の写真を保存すると、アプリケーションの実行時に大量のメモリが消費されます。
Heroku にデプロイしていますか? 多くの RoR アプリはそうであり、Heroku にデプロイすると、アプリが別の dyno に移動されたときに、ローカルに保存されているすべてのファイルが破棄されます (通常、これがいつ発生するかを予測する方法はありません)。ここでエフェメラル ファイルシステムについて読むことができますhttps://devcenter.heroku.com/articles/dynos#isolation-and-security
一般に、すべての画像をローカルに保存しないことをお勧めします。スケーリングに合わせてコードを書き直すのは面倒だからです。Amazon S3 バケットにアップロードし、必要に応じて画像をダウンロードすることをお勧めします (そして、ユーザーがログインしたときのために画像をキャッシュします)。画像処理 (アップロードされた画像のサイズ変更、アップロードされた画像のサムネイル バージョンの作成など) を処理する必要がある可能性があるため、これらのファイルに永続的にアクセスできるバックグラウンド プロセスがある場合に役立ちます。これには「aws」gem と S3 ライブラリを使用しましたが、これは非常に使いやすく、詳細についてはhttp://amazon.rubyforge.org/を参照してください。
ただし、これを小さなアプリにするつもりで、Heroku にデプロイしない場合は、ローカル ディレクトリに保存するだけで、はるかに簡単で手間がかかりません。