通常上传文件时,都会对文件进行重命名,如果命名规则不够合理,很可能出现文件命名出现冲突的问题。
我总结了两种重命名的方法:
1、md5加密
计算上传文件md5,以这个md5作为文件名称。这种方式出现重名,并且重名的文件是不一样的的几率由md5出现碰撞的几率决定。
使用md5重新命名的方法,有一个好处,就是上传同样的文件,服务器只会保存一份,不会浪费空间。这个方法的缺点也是比较明显的,就是md5名称看起来不是很友好,而且md5如果出现碰撞,就会导致数据丢失。现在md5的碰撞也逐渐被找到。有兴趣的童靴可以自行研究下。
2、以日期方式重命名
我个人比较喜欢这种方法,但是如果精确到秒的话,名称重复的可能性就非常高了,所以通常要精确到微秒。形如下面的格式:
2012 09 20 17 21 55 927386 . jpg 年 月 日 时 分 秒 微秒 后缀
因为每个目录下的文件数量是有限制的,所以还要细分目录进行存储,我常用年月日来分目录,就是每天上传的文件保存到一个目录。把上面的格式稍微改一下,改成下面的格式:
2012/09/20/ 17 21 55 927386 . jpg 年/月/日/ 时 分 秒 微秒 后缀
在正式保存文件时要循环检验要保存的地址是否已经存在文件了,如果文件已经存在,就要重新命名,直到文件不存在为止。以下是实现的伪代码:
file <- rename(upload_file) while file_exists(file) do file <- rename(upload_file)
附:
php获取微秒的实现,其中u表示微秒:
function getDatetime($formatString='Y-m-d H:i:s') { if (strpos($formatString, 'u') !== false) { $t = microtime(true); $micro = sprintf("%06d", ($t - floor($t)) * 1000000); $formatString = str_replace('u', $micro, $formatString); return date($formatString, $t); } return date($formatString); }
转载请注明:快乐编程 » php上传文件高并发时,文件重新命名规则