2013-07-25 23 views
1

我大致想出瞭如何將文件上傳到服務器如果文件不存在。現在如果文件存在,我希望客戶端能夠覆蓋/刪除現有文件並上傳新文件。是的,這兩個文件必須具有相同的名稱。如何刪除服務器上的文件並添加一個基於客戶端的新文件選擇

因此,我試圖做的是當文件存在使用調用一個函數,要麼刪除現有文件並上傳新文件或強制PHP代碼,因此死取消上傳

if (isset($_GET['run'])) $linkchoice=$_GET['run']; 
    else $linkchoice=''; 

    switch($linkchoice){ 
     case 'one' : 
      upload_file(); 
      break; 
     case 'two' : 
      kill(); 
      break; 
switch語句

然後我們一個鏈接來執行一個功能

<a class=button href='?run=one'>Replace Existing File</a><br/> 
    <a class=button href='?run=two'>Cancel Upload</a> 

這裏是我試圖把它放在一起。

<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors',1); 


    $allowedExts = array("xml"); 
    $temp = explode(".", $_FILES["file"]["name"]); 
    $extension = end($temp); 
    if (($_FILES["file"]["type"] == "text/xml") 
    && in_array($extension, $allowedExts)){ 
     if ($_FILES["file"]["error"] > 0){ 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; 
     } 

     else{ 
     if (file_exists("SIMxml/" . $_FILES["file"]["name"])){ 

     echo $_FILES["file"]["name"] . " file already exists.<br/>"; 
     $file = $_FILES["file"]["name"]; 
     $type = $_FILES["file"]["type"]; 
     $size = ($_FILES["file"]["size"]/1024); 

     /* if (isset($_GET['run'])) $linkchoice=$_GET['run']; 
      else $linkchoice=''; 

      switch($linkchoice){ 

      case 'one' : 
       upload_file($file,$type,$size,$temp); 


      case 'two' : 
       kill(); 

      } 

      echo "<a class=button href='?run=one'>Replace Existing File</a><br/>"; 
      echo "<a class=button href='?run=two'>Cancel Upload</a>"; */ 

      } 

     else{ 
      echo "File: " . $_FILES["file"]["name"] . "<br>"; 
      echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
      echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 

      move_uploaded_file($_FILES["file"]["tmp_name"], 
      "/var/www/jd/SIMxml/" . $_FILES["file"]["name"]); 
      echo "Stored in: " . "SIMxml/" . $_FILES["file"]["name"]; 
      } 
     } 
    } 
    else{ 
     echo "Invalid file"; 
     } 

    ?> 

    <?php 
    error_reporting(E_ALL); 
    ini_set('display_errors',1); 

    function delete_file($file){ 
    unlink("/var/www/jd/SIMxml/" . $file); 
    } 
    function upload_file($file,$type,$size,$temp){ 
    echo $file; 
    delete_file($file); 

    echo "File: " . $file . "<br>"; 
    echo "Type: " . $type . "<br>"; 
    echo "Size: " . $size . " kB<br>"; 

    move_uploaded_file($temp, 
    "/var/www/jd/SIMxml/" . $file); 
    echo "Stored in: " . "SIMxml/" . $file; 
    } 
    function kill(){ 

    } 

    ?> 

很明顯,這是行不通的,而我正在與捆綁或實施幾個概念/想法一起掙扎。

我想了解如何實現這一點的一些建議。

謝謝你在前進,JD

+0

unlink('/ var/www/jd/SIMxml /'.$文件名) –

回答

0

所以,@Jacob S讓我想到了如何區分我的請求,而不是創建一個會話或實現「預上傳」請求,我走了一條不同的路線。

在代碼的第一個版本(原始問題)中,我嘗試將switch語句嵌入到邏輯操作中,並且由於該文件的參數未被傳遞,因此它似乎失敗。所以爲了解決這個問題,我首先檢查文件是否存在以及是否存在,然後從實際的臨時文件中創建一個僞臨時文件。

if (file_exists("/var/www/jd/SIMxml/" . $file)){ 
       $ftemp = "/var/www/jd/temp/" . $file; 
       move_uploaded_file($tmp, 
       $ftemp); 

要從形式獲得$ tmp文件名我用

$tmp = $_FILES["file"]["tmp_name"]; 

二:我用一個超鏈接在被選擇時就會調用PHP文件delete.php,從我的理解。嵌入到超鏈接中的是重命名僞臨時文件所需的參數。

echo "<p><a class=button href='delete.php?run=one&file=$file&temp=$temp'> 
      Replace Existing File</a></p>"; 
    echo "<p><a class=button href='delete.php?run=two&file=$file&temp=$ftemp'> 
      Cancel Upload</a></p>"; 
    die(); 

三:設置在delete.php文件

<?php 
    function delete_file($file){ 
     unlink("/var/www/jd/SIMxml/" . $file); 
     if (file_exists("/var/www/jd/SIMxml/" . $file)){ 
      echo "SIMxml/" . $file. " Was not deleted"; 
    } 
    function upload_file($file,$temp){ 
     rename ($temp, "/var/www/jd/SIMxml/" . $file); 

     if (file_exists("/var/www/jd/SIMxml/" . $file)){ 
      echo "Stored in: " . "SIMxml/" . $file; 
     } 
     else{ 
      echo $file,"<br/>";; 
      die ("File was not uploaded."); 
     } 
    } 
    function kill($temp){ 
     unlink($temp); 
     die('The upload was canceled'); 
    } 
    ?> 

這裏我的職務是PHP段調用都刪除,並上傳等功能,完成上傳過程。你可以在這裏使用switch語句,但不要選擇。

<?php 
    if($_REQUEST['run'] == 'one'){ 
     delete_file($_GET['file']); 
     upload_file($_GET['file'],$_GET['temp']); 
    } 
    if($_REQUEST['run'] == 'two'){ 
     kill($_GET['temp']); 
    } 
    ?>  

我假設的超級鏈接創建某種類型的關聯數組和$ _Get與陣列中檢索參數,搞不清是如何工作的呢。但我知道它得到我需要的東西

 upload_file($_GET['file'],$_GET['temp']); 
    } 
    ?> 

現在,是完成我想要做的最好的方法嗎?可能不是,但它工作到目前爲止。我還應該說明,如果不是很明顯,將其他相關問題拼湊在一起,並不是一個「原創」的想法,它可能是完成手頭任務的最糟糕的方式, 所以記住這一點。

1

不是問題的答案,但不適合評論:

if (file_exists("SIMxml/" . $_FILES["file"]["name"])){ 

在這裏,您使用相對路徑,但如果你的劇本都沒有改變其當前的工作目錄,你會擁有無窮無盡的麻煩,因爲在別處:

move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/jd/SIMxml/" . ... 

unlink("/var/www/jd/SIMxml/" . $file); 

您使用絕對路徑。不是一個好主意。

+0

所以我應該堅持一個或另一個,對。考慮到我知道在我可預見的未來,目錄位置永遠不會改變,但我會更改php文件位置,我應該堅持使用絕對路徑? – Jim

0

請記住,您有兩個單獨的請求 - 第一個是上傳文件,第二個是試圖設置選項,但您沒有「文件」了,因爲它是一個新的請求。

你要麼需要:

  1. 存儲到文件的引用的某處上傳,如會話,或
  2. ,以使文件上傳之前的判定結果是改變你的過程,例如使用(a)同步JavaScript請求來確定將要上傳的文件名是否已經存在,並且在允許提交/上載之前使用該確定請求額外輸入 - 預先上傳的排序請求。
相關問題