2011-05-23 44 views
2

我正在創建一個網站,要求爲每個用戶上傳個人資料圖片以及調整大小的版本。我將使用mysql來存儲圖像的ID和其他信息。我從不想處理重新安排靜態文件,所以讓我們假設這個網站有數千個用戶。我想知道什麼是最好的目錄結構來存儲圖像?處理大量上傳圖片的最佳目錄結構是什麼?

我看到幾個提到的方法先前:

1)MD5(image_id),然後如果散列是49f68a5c8493ec2c0bf489821c21fc3b,該結構將是/ 49/F6/8A/5C/84/93/EC/2c的/0b/f4/89/82/1c/21/fc/3b.jpg(或..... 3b/filename.jpg)。這種方式似乎可以處理很多,但看起來它可能會創建幾個太多的目錄。可能是這種方法的變體?

2)/年/月/日/(可能是小時)/id.jpg

那麼怎麼辦呢?

+0

這是什麼image_id你說的?使用PHP如何找到它? – carbonr 2012-05-05 05:31:21

回答

3

在這樣一個獨特的哈希向下鑽取子目錄是一個很好的解決方案,但子目錄的在你的例子數爲方式太多。每個兩個字符的子目錄可以支持256個條目,所以如果你要有5000個用戶,每個子目錄只有大約20個文件時,只有一個深度,這是非常合理的。深兩級將輕鬆處理數百萬用戶。

另外,我不會將文件名剪切爲散列上剩餘的字符。無論您深入到多少層次,都使用完整散列作爲文件名。如果需要(例如)將它們移動到新的商店,文件將更容易管理。即,不這樣做:

49/f68a5c8493ec2c0bf489821c21fc3b.jpg 

這樣做:

49/49f68a5c8493ec2c0bf489821c21fc3b.jpg 
0

我通常存儲在數據庫中像這樣的格式旁邊的圖像記錄的鍵:

userid/md5(image_id)_time.ext 

這是一件好事,因爲它使人們能夠「竊取」你的整個集合而不做一堆工作。此外,它有助於命名碰撞,以防更新原始圖片並希望在某段時間內存儲「舊」圖片(這在某些情況下可能會有所幫助)。另外,您可以將其設置爲永不過期,因爲您永遠不會再更新它。您可能需要定期進入並刷新「舊」文件,但這是一個不同的問題。

0

如果我將文件名作爲id存儲在圖像中,我傾向於使用以下結構;

/0/1.jpg 
/500/501.jpg 
/1000/1001.jpg 
/1500/1501.jpg 

這個想法是創建不超過500張圖片的文件夾,並將基文件夾編號爲起點。這並不需要任何特殊的數據庫字段或散列,你可以選擇有多於或少於500

0

圖像/ MD5(USER_ID)/ USER_ID/*。JPG

這樣,你的前兩個字符沒有其他文件/目錄的數千個目錄,並且避免具有太多嵌套樹木

例如

images/a9/1000/foo.jpg 
images/a9/1000/bar.jpg 
images/a9/107/baz.jpg 
images/1f/24/goo.jpg 
相關問題