2014-10-02 26 views
0

我正在試着用一個簡單的文件上傳PHP腳本來處理一些文件有效性檢查。這是一個簡單的W3C示例,其中添加了while循環來檢查文件是否存在,然後在文件名的末尾添加一個增量(僅在文件擴展名之前)。PHP - 如何防止覆蓋文件名增量的現有文件?

該腳本有效,但只會產生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

首先,你應該用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是否已經存在。而事實並非如此。

+0

'$ name。 $ i。 '' 。 $ extension' – mudasobwa 2014-10-02 07:07:04

+0

Oh thx :-)更正以上 – TiMESPLiNTER 2014-10-02 07:09:48

+0

非常棒!隨着更正,腳本現在執行完美。謝謝! – Matthew6 2014-10-02 07:18:28