是的,是的,我知道這是一個古老的話題。但是存儲大量圖像的問題以及底層文件夾結構應如何組織。所以我以我的方式來處理它,希望這可以幫助一些人。
使用md5散列的想法是處理海量圖像存儲的最佳方式。請記住,不同的值可能具有相同的散列,我強烈建議將用戶標識或nicname添加到路徑中以使其具有唯一性。是的,這就是所需要的。如果某人有不同的用戶使用相同的數據庫ID - 那麼出現問題了;)因此root_path/md5_hash/user_id
就是您需要做的所有事情。
使用DATE/DATETIME/TIMESTAMP不是IMO方式的最佳解決方案。你最終會在布西日獲得大量的圖片文件夾,而在不太經常光顧的圖片文件夾中幾乎是空的。不確定這會導致性能問題,但有一些像數據美學和一致的數據分佈總是優越的。
所以我清楚地去尋找解決方案。
我寫了下面的函數,以便於生成這種基於散列的存儲路徑。隨意使用它,如果你喜歡它。
/**
* Generates directory path using $user_id md5 hash for massive image storing
* @author Hexodus
* @param string $user_id numeric user id
* @param string $user_root_raw root directory string
* @return null|string
*/
function getUserImagePath($user_id = null, $user_root_raw = "images/users", $padding_length = 16,
$split_length = 3, $hash_length = 12, $hide_leftover = true)
{
// our db user_id should be nummeric
if (!is_numeric($user_id))
return null;
// clean trailing slashes
$user_root_rtrim = rtrim($user_root_raw, '/\\');
$user_root_ltrim = ltrim($user_root_rtrim, '/\\');
$user_root = $user_root_ltrim;
$user_id_padded = str_pad($user_id, $padding_length, "0", STR_PAD_LEFT); //pad it with zeros
$user_hash = md5($user_id); // build md5 hash
$user_hash_partial = $hash_length >=1 && $hash_length < 32
? substr($user_hash, 0, $hash_length) : $user_hash;
$user_hash_leftover = $user_hash_partial <= 32 ? substr($user_hash, $hash_length, 32) : null;
$user_hash_splitted = str_split($user_hash_partial, $split_length); //split in chunks
$user_hash_imploded = implode($user_hash_splitted,"/"); //glue aray chunks with slashes
if ($hide_leftover || !$user_hash_leftover)
$user_image_path = "{$user_root}/{$user_hash_imploded}/{$user_id_padded}"; //build final path
else
$user_image_path = "{$user_root}/{$user_hash_imploded}/{$user_hash_leftover}/{$user_id_padded}"; //build final path plus leftover
return $user_image_path;
}
功能測試呼叫:
$user_id = "1394";
$user_root = "images/users";
$user_hash = md5($user_id);
$path_sample_basic = getUserImagePath($user_id);
$path_sample_advanced = getUserImagePath($user_id, "images/users", 8, 4, 12, false);
echo "<pre>hash: {$user_hash}</pre>";
echo "<pre>basic:<br>{$path_sample_basic}</pre>";
echo "<pre>customized:<br>{$path_sample_advanced}</pre>";
echo "<br><br>";
輸出結果 - 着色爲了您的方便):
您是否考慮爲每個用戶製作一個文件夾,可能使用/ letter /用戶名格式(例如'images/o/omg_unicorns'或'images/p/powerlord') – Powerlord 2010-04-15 20:19:00
工作正常,但用戶名可以更改。我將編輯並添加此信息。 – Mathew 2010-04-15 20:25:33