【问题标题】:PHP - How to prevent override of existing files with filename increment?PHP - 如何防止用文件名增量覆盖现有文件?
【发布时间】:2014-11-27 03:32:26
【问题描述】:

我正在尝试一个简单的文件上传 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";
}
?>

【问题讨论】:

    标签: php file upload overriding increment


    【解决方案1】:

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

    之后你可以检查

    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 是否已存在。但它没有。

    【讨论】:

    • $name . $i . '.' . $extension
    • 出色的收获!通过更正,脚本现在可以完美运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2012-11-20
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多