2012-01-25 15 views
9

私の質問は、ディスクやDBに画像を保存することではありません。ギャラリー用の画像を保存する場合のベストプラクティスは何ですか?

  • 画像はイメージパスや他の画像データがデータベースに保存されます
  • ディスク上に保存されます。
  • 画像は
  • 画像は、時間では3つのサイズ
  • に格納される一意のファイル名が与えられます多くのユーザーによって使用される多くの画像があるかもしれません

私の質問は以下のとおりです。
- 画像はする必要があります1つのフォルダ、または多くのフォルダに格納されますか?
- 一意のIDを作成するのにmd5を使用してもよろしいですか?例えば。 - イメージをサーバーまたはクライアントのブラウザ/コンピュータにキャッシュする必要がありますか?

他に何か考えるべきですか?

解決策は、php、apache、およびmysqlを使用しています。 Uploadifyを使用して画像をアップロードします。

私はキャッシングについて

/** 
    * Calculate dir tree for object 
    * Folders starts from 00 to FF (HEX) and can have just as 
    * many subfolders (I think :) 
    * @param $id - User ID 
    * @param $type - Image category 
    * @return string 
    */ 
    function calculateDirTree($id, $type) 
    { 
     $hashUserID = substr(hash('md5', $id), -4); 
     $parentFolder = substr($hashUserID,0,2); 
     $subfolder = substr($hashUserID,2);  
     $basePath  = $type."/".$parentFolder.'/'.$subfolder.'/'; 

     return $basePath; 
    } 
+0

イメージはいくつありますか?百人?何千?数十万人 ? –

+0

今後数年間、私は100k〜200kの画像を推定しています。 – Steven

+0

アップロードしたのと同じファイル名を使用しますか?同じフォルダに保存すると、以前にアップロードされた画像と同じファイル名を持つ場合、画像を置き換える可能性があります。 –

答えて

3

イメージを1つのフォルダまたは多数のフォルダに保存する必要がありますか?

あなたは "100k - 200kの画像"について話していますので、多くのフォルダが必要です。最大にしてみてください。フォルダ上の〜1000画像。

一意のIDを作成するのにmd5を使用してもよろしいですか?例えば。 md5(id + filename + random_num)

はい、これは可能です。長いファイル名の問題を避けることができます。

イメージをサーバーまたはクライアントのブラウザ/コンピュータにキャッシュする必要がありますか?

クライアントサイドにキャッシュする必要があります。非常に多くのイメージの問題は、トラフィックが多いことです。これを減らすのにクライアントのキャッシュが役立ちます。

0

今日使用する一部のコードは、両端で、それをキャッシュするのが最善だろう、そのように新しい画像を迅速に検索して、既存のイメージを訪れたユーザーは、それがキャッシュされています。

私は、1つまたは複数のフォルダにファイルシステムを保存する際のファイルシステムの制限についてはわかりません。

0

複数のフォルダを使用するか、同じフォルダがWebアプリケーションに依存すると思います。たとえば、複数のプロファイルが複数のイメージを持つ複数のプロファイルがある場合は、フォルダ名をプロファイル名として使用して複数のフォルダを使用できます。

私の最後のアドバイスは、暗号化アルゴリズムを使用して、処理したい画像の数に応じて衝突

3

を防止するために優れているSHA256あなたは画像のトンを持っている場合、私は強く、いくつかのフォルダを使用することをお勧めします。最も簡単な方法は、ファイル名の最初の文字を使用してフォルダ構造を作成することです。私が思うに、数字はこのようなものです:

less than 1000 images --> one folder 
less than 20000 images --> one level of folders (a, b, c, ...) 
more     --> several levels (a containing aa, ab, b containing ba, bb, ...) 

YMMV

+0

私は私のテストで使用したファイル構造を追加しました。私はこれにこだわるべきかどうか考えている。 – Steven

0

はdefinetelyファイルシステムのために行く:それはよりパフォーマンスだとファイルを(それがために作られているものです)を格納するためのより良いフィット。大きな画像を保存/取得するときにSQLが遅くなることがあります。 各ユーザーのフォルダを作成することができます(フォルダ名としてIDを使用)。イメージがファイルシステムに保存されると、UserImagesテーブルに参照を保存することができます。保存するときに名前を変更することで、各イメージに固有のファイル名が付いていることを確認できます。元のファイル名と実際のDateTimeの組み合わせを使用できます(MD5を使用する必要はありません)。 また、あなたとクライアントの帯域を節約するために、画像は常にキャッシュされるべきです。

+0

あなたは私の質問を読んで、私はディスクやDBが最善であるかどうか尋ねていません。また、あなたはちょうど上記の私の質問を(言い換えれば)記述しました。 – Steven

+0

こんにちはスティーブン、私の答えを再度読んで、私はあなたの質問に答えてみましたが、それは明らかではない場合:1)はい、複数のフォルダ(最高のユーザーごとに1つのフォルダ)に画像を分割する必要があります。 2)いいえ、ファイル名にmd5は必要なく、アップロードのDateTimeを使用するだけです。 3)はい、サーバー上の同じイメージが変更されない場合(イメージが切り取られ、同じファイル名を保持する場合)、イメージをキャッシュする必要があります。それがあなたが探しているものでないなら、あなたの質問を再調整してください。 –

関連する問題