ユーザーが画像をアップロードできるソーシャルシステムを開発しています。
ファイルをどのように構成すればよいかよくわかりません。私が持っている2つのアイデアは次のとおりです。
- 名前としてユーザーIDを持つフォルダーを追加し、そこにすべてのユーザーの画像を入れます
- すべての画像に 1 つのフォルダーを用意し、各画像に一意の名前を付けます
2つのうちのどちらがより良いでしょうか?画像を整理する適切な方法ですか?
ユーザーが画像をアップロードできるソーシャルシステムを開発しています。
ファイルをどのように構成すればよいかよくわかりません。私が持っている2つのアイデアは次のとおりです。
2つのうちのどちらがより良いでしょうか?画像を整理する適切な方法ですか?
場合によります。
ユーザーごとのディレクトリに画像が保存されているギャラリーを使用する場合、重複についても心配する必要があります (ユーザーが同じ名前の複数のファイルをアップロードするとします)。
一方、最初のケースでは、1 つのディレクトリ内のファイル数に関連するパフォーマンスの問題が発生する可能性があります (10k を超えるファイルがある場合、遅延する可能性があります)。
私が気に入っている解決策は、一意の名前を作成し、それをいくつかの部分に切り取ってディレクトリ構造を作成することです。
例えば:
ファイルから生成しますimage.jpg
(マニュアルを参照してください)、たとえば一意の名前を付けます
nfsr53a5gb
それに元の拡張子を追加して、nfsr53a5gb.jpg
で分割し/
ますnf/sr/53/a5/gb.jpg
必要に応じて不足しているフォルダーを作成します(recursive
パラメーターを参照)
ディレクトリ内のファイル数のペナルティがすぐに発生することはなく、競合が発生したり、ファイルの URL が推測しにくいものになったりすることもありません。
いい感じは、名前を元の名前に変更するファイルを取得するためのコントローラーを追加することです(データベースに保存してヘッダーを切り替えます)。これは、ページに埋め込まれた多くの画像に対して CPU と I/O を集中的に使用する可能性があるため、専用のダウンロード ボタンにのみ使用してください。
これを行うには、次のようにヘッダーを変更する必要があります。
Content-Disposition: attachment; filename=YOUR_FILE_NAME.YOUR_EXTENSION
Content-Type: application/octet-stream
#2のオプションを選択するか、ユーザー数が増えるとフォルダ数が増え続けます。
コードで画像を取得する場合も、この方法の方が簡単です。