【问题标题】:PHP fileupload: keep both files if same namePHP fileupload:如果名称相同,则保留两个文件
【发布时间】:2012-12-29 11:58:57
【问题描述】:

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

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

【问题讨论】:

  • 使用file_exists()函数你可以很简单地实现这个
  • 但 file_exists 只告诉我真假……
  • 是的,你需要照顾更多的东西,先写简单的算法然后在编码中实现它,它对你来说更容易
  • "简单算法" ? ja,基本上我知道你是什么意思,但我不知道如何解决这个问题。 :(

标签: php file-upload file-rename


【解决方案1】:

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

$file=pathinfo(<your file>);

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

$filename=$file['filename'];

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

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

给你,你的&lt;append something&gt; 的原始文件尚不存在。

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

【讨论】:

  • 很简单!!! :) 但我认为自动增量解决方案更好。但是谢谢!!!
  • @Salman A:以什么方式?我仔细检查了一下,没有发现任何问题。
  • 我的意思是$filename." ($i)"; 是做什么的?我没有看到任何作业。
【解决方案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 代替正则表达式;这种方式简单得多。
【解决方案3】:

您可以使用下面的这个函数来获取上传的唯一名称

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我需要任何正则表达式吗?当然我可以检查原始文件名是否已经存在,但是如果我尝试上传另一个 Cover.png 怎么办。我怎么知道已经有多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多