2012-01-25 126 views
9

我的問題不在於將圖像存儲在磁盤或數據庫中。當爲圖庫存儲圖像時,最佳做法是什麼?

  • 圖像將被存儲在磁盤上
  • 圖像路徑和其它圖像數據將被保存在數據庫中。
  • 的圖像將被賦予一個唯一的文件名
  • 圖像將被存儲在3種尺寸
  • 隨着時間的推移可能會被很多用戶

我的問題,使用的許多圖像是:
- 如果圖像是存儲在一個文件夾或多個文件夾中?
- 可以使用md5創建唯一的ID嗎?例如。 md5(id +文件名+ random_num)
- 圖像應緩存在服務器上還是客戶端瀏覽器/計算機上?

還有什麼我應該考慮的?

解決方案是使用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

圖像應該存儲在一個文件夾還是多個文件夾中?

你說的是「100K - 200K圖片」如此多的文件夾是一個必須具備的。嘗試有最大值。在文件夾中〜1000張圖像。

它是確定使用MD5創造獨特的ID?例如。 MD5(ID +文件名+ random_num)

是的,你可以做到這一點。它將避免長文件名的問題。

應的圖像進行瀏覽器/計算機上的服務器或客戶端上緩存?

的應在客戶端緩存。這麼多圖像的問題是它會產生很高的流量。緩存客戶端有助於減少這種情況。

0

關於緩存,這將是最好的兩端緩存它,這樣新的圖像快速檢索,以及用戶訪問現有的圖像有它的緩存。

我不知道有關將它們存儲在一個或多個文件夾中的任何文件系統限制。

0

我認爲使用多個文件夾或相同的文件夾是依賴於您的Web應用程序。例如,如果有多個配置文件,每個配置文件都有多個圖像,則可以使用多個文件夾並使用文件夾名稱作爲配置文件名稱。

我最後的建議是,如果你有一大堆的圖像SHA256加密算法是爲了防止碰撞

3

根據要處理,我會用幾個文件夾強烈建議圖像的數量更好。最簡單的方法應該是使用文件名的第一個字母來創建文件夾結構。我認爲,這個數字是這樣的:

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, ...) 

因人而異

+0

我已經添加了我在測試中使用的文件結構。我正在考慮是否應該堅持這一點。 – Steven

0

definetely去的文件系統:它更高性能和適合用於存儲文件的更好(這是由對)。 Sql在保存/檢索大圖像時可能會變慢。 您可以爲每個用戶(使用ID作爲文件夾名稱)創建一個文件夾,並且當圖像保存在文件系統上時,您可以將引用保存在UserImages表上(通過在sql上將用戶保存爲文件名)。您可以通過在保存每個圖像時對其進行重命名來確保每個圖像具有唯一的文件名,您可以將原始文件名與實際日期時間(不需要使用MD5)結合使用。 此外,圖像應該總是被緩存以保存你的客戶和帶寬。

+0

如果您閱讀我的問題,我不問磁盤或數據庫是否最好。此外,你剛剛(更多的話)描述了我的問題。 – Steven

+0

嗨史蒂芬,如果你看了一遍我的回答,我試着回答你的問題,如果它是不明確的:1)是的,你應該分割成不同的文件夾中的圖像(每用戶最好的一個文件夾)。 2)不,你不需要md5作爲文件名,只需使用上傳的日期時間即可。 3)是的,如果服務器上的相同圖像沒有改變(如:圖像被剪切並保持相同的文件名),您應該緩存圖像。如果這不是你想要的,請重新表達你的問題。 –

相關問題