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')";

如您所见,它重命名上传的文件,包括一个随机数。

有时,它碰巧将文件重命名为已经存在的数字。

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

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

4

6 回答 6

0

使用file_exists内置函数。

于 2012-11-19T11:54:58.597 回答
0

您可以通过使用(例如)基于时间的方法来更改创建随机 digists 的方式

$random_digit = microtime(TRUE);

于 2012-11-19T11:55:33.820 回答
0

您可以使用如下

$random_digit = time();

于 2012-11-19T11:56:45.397 回答
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')格式而不是关闭日期('Ymd'),最好通过调用time()函数来使用时间戳(http://www.php.net/manual/en /function.time.php )

阿纳斯,

于 2012-11-19T12:03:31.190 回答
0
if (file_exists($random_digit)) {
   $random_digit = rand(0000,9999);
}
于 2012-11-19T12:06:23.953 回答
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.
于 2012-11-19T12:06:44.653 回答