簡體   English   中英

PHP-如何防止文件名增加覆蓋現有文件?

[英]PHP - How to prevent override of existing files with filename 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";
}
?>

首先,您應該將值0而不是'' (空字符串)初始化$i變量。

之后,您可以檢查

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

因為您將文件移動到

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

然后。 因此,如果您上傳test.jpg請檢查是否已經存在upload/test.jpg 如果是,則進入while -loop並檢查文件upload/test.jpg1已存在。 如果否,則將上傳的文件移動到upload/test1.jpg

下次您再次檢查文件upload/test.jpg1已經存在。 事實並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM