PHP上传文件推荐命名规则

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

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

1、md5加密

计算上传文件md5,以这个md5作为文件名称。这种方式出现重名,并且重名的文件是不一样的的几率由md5出现碰撞的几率决定。

使用md5重新命名的方法,有一个好处,就是上传同样的文件,服务器只会保存一份,不会浪费空间。这个方法的缺点也是比较明显的,就是md5名称看起来不是很友好,而且md5如果出现碰撞,就会导致数据丢失。现在md5的碰撞也逐渐被找到。有兴趣的童靴可以自行研究下。

2、以日期方式重命名

我个人比较喜欢这种方法,但是如果精确到秒的话,名称重复的可能性就非常高了,所以通常要精确到微秒。形如下面的格式:
[php]
2012 09 20 17 21 55 927386 . jpg
年 月 日 时 分 秒 微秒 后缀
[/php]
因为每个目录下的文件数量是有限制的,所以还要细分目录进行存储,我常用年月日来分目录,就是每天上传的文件保存到一个目录。把上面的格式稍微改一下,改成下面的格式:
[php]
2012/09/20/ 17 21 55 927386 . jpg
年/月/日/ 时 分 秒 微秒 后缀
[/php]
在正式保存文件时要循环检验要保存的地址是否已经存在文件了,如果文件已经存在,就要重新命名,直到文件不存在为止。

通过试验可以发现,date函数并不支持“微秒”的输出,总是输出“00000”。下面给出一个支持微秒的时间输出函数。
[php]
/*
* 功能:支持微秒的时间输出函数
* 参数:$format 时间格式
* 返回:无
*/
private function udate($format = ‘u’, $utimestamp = null) {
if (is_null($utimestamp))
$utimestamp = microtime(true);

$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp – $timestamp) * 1000000);

return date(preg_replace(‘`(?< !\\\\)u`', $milliseconds, $format), $timestamp); } [/php]



发表评论

电子邮件地址不会被公开。