最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

php上传文件高并发时,文件重新命名规则

PHP 4454浏览 0评论

通常上传文件时,都会对文件进行重命名,如果命名规则不够合理,很可能出现文件命名出现冲突的问题。

我总结了两种重命名的方法:

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上传文件高并发时,文件重新命名规则

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址