PHP文件上传:如果文件名相同,请保留两个文件

3

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

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

使用file_exists()函数,您可以非常简单地实现这一点。 - Mahesh.D
但是file_exists只会返回true或false... - YeppThat'sMe
1
呀,你需要注意更多的事情,先写一个简单的算法,然后再用编码实现它,这样会更容易。 - Mahesh.D
"简单算法"?是的,基本上我知道你的意思,但我不知道如何解决。:( - YeppThat'sMe
4个回答

6
首先,让我们分离扩展名和文件名:
$file=pathinfo(<your file>);

为了更方便地检查文件并追加内容,将文件名保存到新变量中:
$filename=$file['filename'];

接下来,让我们检查文件是否已经存在,并保存新的文件名,直到不存在为止:

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

这里有一个原始文件,其中包含您尚不存在的<添加一些内容>

编辑: 已添加自动递增编号。


相当容易!!! :) 但是我认为自增解决方案更好。不过谢谢!!! - YeppThat'sMe
@Salman A:以什么方式?我已经仔细检查了,没有发现任何问题。 - Kristjan O.
我的意思是$filename." ($i)";是什么意思?我没有看到任何赋值。 - Salman A

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;

你可以使用 pathinfo 代替正则表达式,这样会简单得多。 - Salman A

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;
}

您可以在 GitHub 页面 这里 获取可用的脚本。


-2
使用file_exists()函数和rename()函数来实现你想要做的事情!

我需要使用正则表达式吗?当然,我可以检查原始文件名是否已经存在,但是如果我正在尝试上传另一个Cover.png呢?我如何识别已经有多少个了? - YeppThat'sMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接