是的,是的,我知道这是一个古老的话题。但是存储大量图像以及如何组织底层文件夹结构的问题。所以我提出了我的处理方法,希望这可以帮助一些人。
使用 md5 哈希的想法是处理海量图像存储的最佳方式。请记住,不同的值可能具有相同的哈希值,我强烈建议将用户 ID 或 nicname 也添加到路径中以使其唯一。是的,这就是我们所需要的。如果某人有不同的用户具有相同的数据库 ID - 那么,有问题;)所以root_path/md5_hash/user_id 是你需要做的一切。
顺便说一句,使用 DATE / DATETIME / TIMESTAMP 并不是最佳解决方案。在忙碌的一天,你会得到一大堆图像文件夹,而在不常去的时候,这些文件夹几乎是空的。不确定这会导致性能问题,但存在数据美学之类的问题,并且一致的数据分布始终是优越的。
所以我显然选择了哈希解决方案。
我编写了以下函数来轻松生成此类基于散列的存储路径。如果您喜欢,请随意使用它。
/**
* 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>";
生成的输出 - 为了您的方便而着色;):