PHP-PHP 生成唯一文件名

PHP-PHP 生成唯一文件名

甜柠檬 发布于 2017-07-02 字数 248 浏览 1556 回复 4

我在做一个可以同时上传多个文件的项目,存在并发问题,必须将文件名称区别防止重名,我想到的办法是使用系统当前时间和用户IP地址,但我担心PHP在单位时间内能够并发处理两个上传请求,时间并不是唯一的标志,请问有没有好的解决方法,或者直接提供相应代码。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

甜柠檬 2017-10-27 4 楼

看你怎么想,个人觉得MD5(时间蹉+随机值)就可以了

虐人心 2017-10-18 3 楼

可以采用机器(电脑)唯一码 + 上传IP + 当前时间戳 + GUID ( + 随机数),然后MD5做为文件名。机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧。

//获取电脑的CPU信息
function OnlyU(){
$a = '';
$b = array();
if(function_exists('exec')){
if(mailto:!@exec( /all",$b)){
return false;
}
}elseif(function_exists('system')){
ob_start();
if(mailto:!@system( /all")){
return false;
}else{
}
$b = ob_get_contents();
ob_end_clean();
$b = explode("n",$b);//print_r($b);
array_pop($b);
}else{
return false;
}

$all = sizeof($b);
for($i = 0; $i < $all; $i++){
if(strpos($b[$i],"Description") !== false){
if(strpos($b[$i+1],"Physical Address") !== false){
$c = explode(":",$b[$i+1]);
$a = trim($c[1]);
break;
}
}
} // End for
return empty($a)?false:$a;
} // End function OnlyU

//获取网卡的MAC的地址

function getMAC() {
@exec("ipconfig /all",$array);
for($Tmpa;$Tmpa<count($array);$Tmpa++){
if(eregi("Physical",$array[$Tmpa])){
$mac=explode(":",$array[$Tmpa]);
return $mac[1];
}
}
}

// 生成guid字符串
function guid($separated = true) {
if (function_exists ( 'com_create_guid' )) {
$charid = substr ( strtolower ( com_create_guid () ), 1, - 1 );
if (! $separated)
return str_replace ( '-', '', $charid );
else
return $charid;
} else {
// 生成一个随机的md5串, 然后通过分割来 获得guid
mt_srand ( ( double ) microtime () * 10000 );
$charid = md5 ( uniqid ( rand (), true ) );
}

if (! $separated) {
return $charid;
}
$hyphen = chr ( 45 );
$uuid = substr ( $charid, 0, 8 ) . $hyphen . substr ( $charid, 8, 4 ) . $hyphen . substr ( $charid, 12, 4 ) . $hyphen . substr ( $charid, 16, 4 ) . $hyphen . substr ( $charid, 20, 12 );
return $uuid;
}

想挽留 2017-09-29 2 楼

可以精确到毫秒级别,然后毫秒级别的时间加上4位随机码,md5(上传时的文件名)

<?php

function filename($filename,$ip) {
return sprintf('%s_%d_%d.%s', md5($filename.$ip), microtime(true) * 1000, mt_rand(1111, 9999), pathinfo($filename, PATHINFO_EXTENSION));
}

echo filename('a.txt','xx'),"n";
echo filename('a.txt','bb'),"n";

泛泛之交 2017-08-30 1 楼

如果能借助数据库的话,比如oracle的sequence就是很好的办法
如果不能,比如可以用session_id()加时间