2012-04-16 13 views
1

ユーザがアップロードした画像を受け入れ、ファイル名を変更してファイルシステムに保存するバックエンドを構築しようとしています(いいえ、Instagramではありません)。データベース設計とイメージファイルシステム管理?

イメージの名前を変更し、ユーザフォルダ:

画像/ {ユーザID}/{ユーザID} _ {MD5(タイムスタンプ)} JPG

団体は、データベースに含まれるであろう。

これはいい/十分なモデルですか?

+1

いい/十分なモデルは何ですか? – JJJ

答えて

2

基本的にあなたの方法だけで結構ですが、ここに私の提案はあなたにある:あなたはすでにDBにファイル名を保存しているので、

  • だけで余分な列を作成し、ファイル名にタイムスタンプを使用してはいけませんタイムスタンプの場合< - > ファイル関係。こうすることで、元の の作成、最終更新、有効期限などの管理が簡単になります。
  • 保存するファイル名の列が一意であることを確認してください。誤って重複するファイル名を格納したくない場合
  • ファイルの受け入れを十字チェックします。ファイルが正常にサーバーに保存されてもクエリが失敗した場合は、失敗したファイル を必ず削除してください。または、操作の順序が逆になっている場合は、ファイルがサーバーに保存されない場合は、DBのエントリを の部分を削除してください。
  • 画像に一般にアクセスできない場合は、画像の表示を拒否し、ファイル名をGET変数として リンク(PHPファイル)に誘導することができます。次に、 セッションおよび/または料理をチェックして、 を表示する権限があるかどうかを判断できます。もしそうであれば、出力のヘッダーは、jpegのものか、それとも表示されているファイルなのかを に設定することができます。
+0

ファイル名をタイムスタンプで保存することは、すべてのファイル名を一意にするため、良い方法です。 – heyanshukla

+0

これは本当ですが、私は正確なタイムスタンプのためにそれらに頼らないと言っていたと思います。私はあなたが何とかmd5されていればcouldntだと思う:Pとにかく、ランダムな文字列を生成するためにrand()を使うと、md5(time())よりもパフォーマンスが良い – aowie1

+0

私はmd5ケース。 – heyanshukla

0

なぜデータベースからの一意のIDを使用しないと、ファイルを見つけるのがずっと簡単になります。

また、ファイルをどのように構造化するかは制限されません。各ファイルのIDがデータベースに関連付けられている場合は、ユーザー名で保存する必要はないでしょう。

user/{database_id}.jpg 
+0

1.jpg、2.jpgなどに行くことで人々が簡単に画像ライブラリ全体にアクセスできるようにしたくない。 –

+1

Ok、 GUIDはそれをデータベースに格納し、その後にファイル名を呼び出します。セキュリティ上の懸念は少なくなりますが、同じ結果になります。 –

0

ちょっと異なります。ユーザーあたり

  • どのように多くの画像?
  • 画像あたり約サイズの範囲は?
  • ユーザー数?
  • どのような並行性が期待されますか?

上記の数値の大部分が小さい場合、方法はおそらく長い間あなたを良い状態に保つのに十分長くなり、少なくとも始めることができます。

私は、MySQLブロブストレージを使用してbad pressを取得していることを知っていますが、これも簡単な方法です。巧妙なコーディングを行うことなくスケールアウトするためにデータベースを破ることができます。言っ

...

は場合は、お使いのシステムでは、ユーザーが使用すると、ファイルシステムのlimits or performance issuesに遭遇する可能性があるファイルの非常に大きな数字をアップロードすることが予想されます。

あなたがWindows上でホスティングされている場合、多くの人が/アップロードする場合、あなたのファイル名は間違いなく8.3 :)

よりも長くなるように、8.3 filename problem(遅い非常にディレクトリが大きくなる)に気を付けますピーク時の使用率で同時にダウンロードすると、I/O競合を監視する必要があります。 RAID 10ボリュームを使用している場合は、SSDを使用するとさらに向上しますが、ストレージ容量の問題が発生する可能性があります。

同じ人物が複数のフォルダにまたがって同じ画像をアップロードする可能性がある場合、あなたの提案した方法は最も効率的な方法ではありません。その場合、データ(例:md5sum)と1つだけのコピーを保存する(はい、削除に関する管理上の問題があります)。

多くの人から大量の画像がたくさん出てくると思うのであれば、最終的には基礎となるストレージを拡大縮小することを考える必要があります。おそらく、{userid}の関数によってデータを分割し、異なるボリュームやマシンに分割することができます。これにより、同時処理のスループットも向上します。

もう1つの質問:あなたはいつも元の画像だけを提供しているのですか、時には再スケーリングされたコピーを返すでしょうか?一度スケールしてプリスケールされたバージョンを返すことをお勧めします。その場合は、スケールされたコピーのストレージも考慮する必要があります。