2012-11-19 170 views
2

我需要帮助添加该功能来检查上传时是否存在文件。检查上传文件重命名前是否存在文件

这是upload.php代码看起来像上传:

$file_name = $HTTP_POST_FILES['ljudfil']['name']; 
$random_digit=rand(0000,9999); 
$mp3 ='.mp3'; 
$pdf ='.pdf'; 
$datum = date('Ymd'); 
$new_file_name=$random_digit.$file_name; 
$target_path1 = $target_path . $orgnr . '_' . $gsm . $pdf; 

$target_path3 = $target_path . 'AC' . $datum . $new_file_name . $mp3; 
$target_path11 = $target_path4 . $orgnr . '_' . $gsm . $pdf; 

$target_path33 = $target_path4 . 'AC' . $datum . $new_file_name . $mp3; 
$targetljudfilftp = 'AC' . $datum . $new_file_name . $mp3; 

move_uploaded_file($_FILES['avtalsfil1']['tmp_name'], $target_path1); 
move_uploaded_file($_FILES["ljudfil"]["tmp_name"], $target_path3); 
$sql = "INSERT INTO affarer (tid, cid, orgnr, ljudfilftp) VALUES 
     (CURDATE(),'$date','$cid','$orgnr', '$targetljudfilftp')"; 

正如你所看到的,它重命名上传的文件,包括一个随机数。

有时候,它会将文件重命名为已存在的数字。

发生这种情况时,它会覆盖我服务器上的前一个文件。

那么,如何添加一个函数来检查目标名称是否存在之前,它用于重命名?

回答

0

您可以使用

if (file_exists($target_path1)) 

验证文件是否存在。

你会做的更好,不过,改变策略,采用tempnam

$target_path = tempnam ($target_path, 'AC' . $datum . $file_name . $mp3) 

这将创建一个文件,如“AC_2012_Anacreon.mp3_xTfKxy” ,但你拥有它是唯一的保证,而即使使用file_exists也会使您面临并发冲突的风险。

当然,该文件不再具有.mp3扩展名,因此您在扫描目录并提供要下载的文件时必须考虑它。

一个仍然不安全,但也许更简单的方法是这样的:

for(;;) 
{ 
    $newname = // some strategy to generate newname, including a random 
    if (!file_exists($newname)) 
     touch($newname); 
    if (!filesize($newname)) 
     break; 
} 

,或者你可以使用一个lock文件,以保证没有并发(因此,这file_exists将返回真理,它会事实):

$fp = fopen('.flock', 'r+'); 
if (flock($fp, LOCK_EX)) 
{ 
    for(;;) 
    { 
     $newname = // some strategy to generate newname, including a random 
     if (!file_exists($newname)) 
     { 
      // this creates the file uniquely for us. 
      // all other writers will find the file already there 
      touch($newname); 
     } 
    }  
    flock($fp, LOCK_UN); 
} 
else 
    die("Locking error"); 
fclose($fp); 
// $newname is now useable. 
0

你可以改变你的随机digists通过使用(例如)基于时间的方法

$random_digit = microtime(TRUE);

0

可以如下

$ random_digit =时间使用()创建的方式;

+0

这将*保证*如果两次上传发生在同一秒内发生冲突。在低流量的网站上,它大部分时间都会工作,但是在高峰期上传时间:-)你可能会遇到麻烦。 – LSerni

0

取而代之的是使用可以生成重复数字的'rand'函数,您可以使用'uniqid'php函数,它返回一个唯一的ID(http://www.php.net/manual/en/function.uniqid.php)。

如果你仍然想使用'rand',你可以使用'file_exists'函数和生成的文件名作为参数(http://www.php.net/manual/en/function.file-exists.php),但是如果文件存在,你必须重新生成文件名,这样你将每次迭代该文件存在。

最后,想用充分的时间日期( 'Ymdhis')格式,而不是关闭日期( '年月日'),这也是更好地通过调用time()函数(http://www.php.net/manual/en/function.time.php

阿纳斯,

使用时间戳
0
if (file_exists($random_digit)) { 
    $random_digit = rand(0000,9999); 
} 
+0

注意:文件不是由数字单独制作的。另外,不能保证你只会有一次碰撞。所以你最好允许一个'while'循环,并且可能是一个“安全计数器”,在经过适当次数的尝试后退出,表示可能没有空闲数字。 – LSerni

相关问题