2015-06-21 170 views
0

如果我在PHP中上傳兩個具有相同名稱的文件,則最新的文件將覆蓋舊版本。爲了防止這個,我寫了下面的代碼。但是,每當我從HTML選擇框中選擇Minor時,它似乎都會超時。我認爲這與我的變量$i分配有關。有任何想法嗎?根據標準上傳文件後重命名文件

if (isset($_POST['addfile'])) { 

// variables 
define('UPLOAD_DIR', 'repository/'); 
$fileName = $_FILES['fileToUpload']; 

if($_POST['rev_type'] == 'Minor') { 

    function update_file_name_minor($file) 
    { 
     $pos = strrpos($file,'.'); 
     $ext = substr($file,$pos); 
     $dir = strrpos($file,'/'); 
     $dr = substr($file,0,($dir+1)); 

     $arr = explode('/',$file); 
     $fName = substr($arr[(count($arr) - 1)], 0, -strlen($ext)); 

     $exist = FALSE; 
     $i = 0.01; 

     while(!$exist) 
     { 
     $file = $dr.$fName.'_'.'Ver '.$i.$ext; 

     if(!file_exists($file)) 
      $exist = TRUE; 

     $i + 0.01; 
     } 

     return $file; 
    } 

    // check for which action should be taken if file already exist 
    if(file_exists(UPLOAD_DIR . $fileName['name'])) 
    { 
     $updatedFileName = update_file_name_minor(UPLOAD_DIR.$fileName['name']); 
     move_uploaded_file($fileName['tmp_name'], $updatedFileName); 

     echo "You have successfully uploaded and renamed the file as a minor revision."; 
    } 
    else 
    { 
     move_uploaded_file($fileName['tmp_name'], UPLOAD_DIR.$fileName['name']); 

    echo "You have successfully uploaded the file."; 
    } 

} 

elseif($_POST['rev_type'] == 'Major') { 

    function update_file_name_major($file) 
    { 
     $pos = strrpos($file,'.'); 
     $ext = substr($file,$pos); 
     $dir = strrpos($file,'/'); 
     $dr = substr($file,0,($dir+1)); 

     $arr = explode('/',$file); 
     $fName = substr($arr[(count($arr) - 1)], 0, -strlen($ext)); 

     $exist = FALSE; 
     $i = 2; 

     while(!$exist) 
     { 
     $file = $dr.$fName.'_'.'Ver '.$i.$ext; 

     if(!file_exists($file)) 
      $exist = TRUE; 

     $i++; 
     } 

     return $file; 
    } 

    // check for which action should be taken if file already exist 
    if(file_exists(UPLOAD_DIR . $fileName['name'])) 
    { 
     $updatedFileName = update_file_name_major(UPLOAD_DIR.$fileName['name']); 
     move_uploaded_file($fileName['tmp_name'], $updatedFileName); 

     echo "You have successfully uploaded and renamed the file as a major revision."; 
    } 
    else 
    { 
     move_uploaded_file($fileName['tmp_name'], UPLOAD_DIR.$fileName['name']); 

    echo "You have successfully uploaded the file."; 
    }   
    }   
} //main if 
+0

您創建了一個無限循環。看看這背後的邏輯:'if(!file_exists($ file))exists = TRUE;' – arkascha

+0

只是將日期字符串添加到結尾 - 這將使文件名始終唯一 – 2015-06-21 05:27:51

+0

所以我應該將它設置爲false ?我將如何修復這個循環? @arkascha – hikaru12

回答

0

您可以在上傳後重命名文件。喜歡這個。

function random_string($length) { 
      $key = ''; 
      $keys = array_merge(range(0, 9), range('a', 'z')); 

     for ($i = 0; $i < $length; $i++) { 
      $key .= $keys[array_rand($keys)]; 
       } 

     return $key; 
      } 

     $filename_tmp=random_string(8); 
     $filename=$filename_tmp.".jpg"; 
    // $filename is autogenerated unique name with 8 Digit. 

// Then change this line: 
     move_uploaded_file($_FILES["image"]["tmp_name"],"UPLOAD_DIR/".$filename);  
+0

你一定要格式化這段代碼,非常難讀 –

+0

我想過使用隨機數生成器,但是我想用上述格式的原因是我可以將它用作個人使用的基本版本控制腳本。它會很快讓我瀏覽並查看上次更改的文件。 – hikaru12

+0

然後,您可以用秒數重命名帶有當前日期時間的文件。那麼所有圖像都是唯一的名稱。 <?php $ filename = date(「d-m-Y H:i:s」);?> – Partha

0

$i += 0.1,改變$fName = current(explode(".",end(explode("/",$file))));,以確保文件名是否正確設定文件位置。