PHP - 如何防止使用文件名增量覆盖现有文件?

时间:2014-10-02 07:02:33

标签: php file upload override increment

我正在尝试一个简单的文件上传PHP脚本,并进行一些文件有效性检查。这是一个简单的W3C示例,添加了while循环来检查文件是否存在,然后在文件名末尾添加一个增量(就在文件扩展名之前)。

该脚本有效,但只会产生1个增量。例如,我上传了一个名为'test.jpg'的文件,它上传,我重新上传相同的文件,脚本生成'test1.jpg' - 但之后,脚本将继续重写'test1.jpg' !

我在这里做错了什么?

<?php
$allowedExts = array("ai", "esp", "jpg", "jpeg", "png", "tiff");
$temp = explode(".", $_FILES["file"]["name"]);
$name = pathinfo($_FILES["file"]["name"], PATHINFO_FILENAME);
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$i = '';

if ((($_FILES["file"]["type"] == "image/ai")
|| ($_FILES["file"]["type"] == "image/esp")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/tiff"))
&& ($_FILES["file"]["size"] < 50000000)
&& in_array($extension, $allowedExts)) 
{
  if ($_FILES["file"]["error"] > 0) 
  {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
  } else
    {
      if (file_exists("upload/" . $_FILES["file"]["name"])) 
      {
        while(file_exists("upload/" . $_FILES["file"]["name"] . $i)) {
          $i++;
        }

        $basename = $name . $i . '.' . $extension;
        move_uploaded_file($_FILES["file"]["tmp_name"],
        "upload/" . $basename);
      } else 
        {
          move_uploaded_file($_FILES["file"]["tmp_name"],
          "upload/" . $_FILES["file"]["name"]);
      }
  }
} else
  {
    echo "Invalid file";
}
?>

1 个答案:

答案 0 :(得分:0)

首先,您应该使用值$i而不是0(空字符串)初始化''变量。

之后你可以检查

if(file_exists("upload/" . $name . $i . '.' . $extension)) { /* .... */ }

因为您将文件移动到

$basename = $name . $i . '.' . $extension;

之后。因此,如果您上传test.jpg,请检查upload/test.jpg是否已存在。如果是,则进入while循环并检查文件upload/test.jpg1是否已存在。如果不是,则将上传的文件移至upload/test1.jpg

下次再次检查文件upload/test.jpg1是否已存在。它没有。