PHP fileupload:如果名称相同,则保留两个文件

时间:2012-12-29 11:58:57

标签: php file-upload file-rename

在PHP中是否有任何漂亮的解决方案,如果文件名已经存在,我可以使用自动增量编号扩展文件名?我不想在一些不可读的东西中重命名上传的文件。所以我认为这样会很好:(允许所有图像文件。)

Cover.png
Cover (1).png
Cover (2).png
…

4 个答案:

答案 0 :(得分:6)

首先,让我们分开扩展名和文件名:

$file=pathinfo(<your file>);

为了便于文件检查和追加,请将文件名保存到新变量中:

$filename=$file['filename'];

然后,让我们检查文件是否已经存在并保存新文件名,直到它不存在:

$i=1;
while(file_exists($filename.".".$file['extension'])){
 $filename=$file['filename']." ($i)";
 $i++;
}

在这里,您有一个原始文件,其中<append something>尚不存在。

修改 添加了自动增量编号。

答案 1 :(得分:2)

知道了:

if (preg_match('/(^.*?)+(?:\((\d+)\))?(\.(?:\w){0,3}$)/si', $FILE_NAME, $regs)) {
        $filename = $regs[1];
        $copies = (int)$regs[2];
        $fileext = $regs[3];

        $fullfile = $FILE_DIRECTORY.$FILE_NAME;
        while(file_exists($fullfile) && !is_dir($fullfile))
        {
                $copies = $copies+1;
                $FILE_NAME = $filename."(".$copies.")".$fileext;
                $fullfile = $FILE_DIRECTORY.$FILE_NAME;
        }
}
return $FILE_NAME;

答案 2 :(得分:0)

您可以在下面使用此功能来获取唯一的上传名称

function get_unique_file_name($path, $filename) {
    $file_parts = explode(".", $filename);
    $ext = array_pop($file_parts);
    $name = implode(".", $file_parts);

    $i = 1;
    while (file_exists($path . $filename)) {
        $filename = $name . '-' . ($i++) . '.' . $ext;
    }
    return $filename;
}

将该功能用作

$path = __DIR__ . '/tmp/';
$fileInput = 'userfile';

$filename = $path . 
    get_unique_file_name($path, basename($_FILES[$fileInput]['name']));

if (move_uploaded_file($_FILES[$fileInput]['tmp_name'], $filename)) {
    return $filename;
}

您可以获得工作脚本here at github page

答案 3 :(得分:-2)

使用file_exists()函数和rename()函数来实现您的目标!