2012-10-02 97 views
3

所以我希望用戶只能上傳文檔或docx的。因此,首先,這裏是我的html:HTML/PHP文件上傳

<form action="upload_file.php" method="post" enctype="multipart/form-data"> 
    Select a file: <input type="file" name="img"> 
    <input type="submit"> 
</form> 

這是我的PHP:

$allowedExts = array("doc", "docx"); 
    $extension = end(explode(".", $_FILES["file"]["name"])); 

    if ($extension!=".doc" || $extension!=".doc" 
    && ($_FILES["file"]["size"] < 200000) 
    && in_array($extension, $allowedExts)) { 
     if ($_FILES["file"]["error"] > 0) 
     { 
      echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
     } 
     else 
     { 
      echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
      echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
      echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
      echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 

      if (file_exists("Proposals/" . $_FILES["file"]["name"])) 
      { 
       echo $_FILES["file"]["name"] . " already exists. "; 
      } 
      else 
      { 
       move_uploaded_file($_FILES["file"]["tmp_name"], 
       "Proposals/" . $_FILES["file"]["name"]); 
       echo "Stored in: " . "Proposals/" . $_FILES["file"]["name"]; 
      } 
     } 
    } else { 
     echo "Invalid file"; 
    } 

每次我試着上傳文件,無論是文檔或一個PNG它輸出這樣的:

Upload: 
Type: 
Size: 0 Kb 
Temp file: 
already exists. 

並沒有結果上傳到Proposals文件夾。所以我有兩個問題:
1)我的代碼有什麼問題?
2)它重定向到upload_file.php並顯示一條消息。是否有辦法實際返回主頁並顯示文本已成功?

+0

閱讀過的例子,你正在使用name =「img」而不是name =「file」http://www.w3schools.com/php/php_file_upload.asp –

+0

不要相信來自用戶的'['type']'數據,它可以是僞造的。使用服務器端MIME類型確定,但也要注意.docx文件實際上只是一個包含一堆其他文件(主要是xml)的.zip文件。另外,你直接使用'['name']'來保存你的文件,允許惡意用戶在你的服務器上隨意寫一個文件。簡而言之,您的腳本是一個打開您的服務器的公開邀請。 –

回答

5

第一個問題已經回答,所以我不會再回答。

2)它重定向到upload_file.php並顯示一條消息。是否有辦法實際返回主頁並顯示文本已成功?

它通常是更好地展示重定向的頁面上的成功的消息,但你可以解決這個問題有兩種方式:

  • 商店前面的URL(或知道),並重定向到它與header("Location: old_page.php");
  • 使窗體的目標成爲iframe。這意味着主頁面本身不會重定向,您可以從upload_file.php(將加載到iframe中)發出響應,爲您的應用程序進行無縫上傳。

而且這是不是得到一個文件擴展名的最佳方式:

$extension = end(explode(".", $_FILES["file"]["name"])); 

嘗試使用PATHINFO代替:http://php.net/manual/en/function.pathinfo.php

$extension = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION); 

而且你if聲明:

if ($extension!=".doc" || $extension!=".doc" 
    && ($_FILES["file"]["size"] < 200000) 
    && in_array($extension, $allowedExts)) { 

即使th是是in_array一個微小的用法我還是會建議服用了這一點,並使用搜索陣列的更實用的方法:http://php.net/manual/en/function.array-search.php

所以你if會像成爲:再次

if (($_FILES["file"]["size"] < 200000) && array_search($extension, $allowedExts)!==false) { 
+0

你爲什麼不編輯GBD的答案與答案編號2 –

+0

@AnthonyHatzopoulos因爲他沒有把我的答案作爲他的答案?我的回答與他完全不同 – Sammaye

4

您的文件字段名稱爲img,並且您已使用$_FILES["file"],但它應該是$_FILES["img"]

你也需要改變你的,如果條件

if (($_FILES["file"]["size"] < 200000) 
    && in_array($extension, $allowedExts)) { 

沒有必要的

$擴展!= 「DOC」 || $擴展!= 「DOC」 & &

2

你將不得不使用$_FILES["img"],而不是$_FILES["file"]或重命名您的輸入名稱爲 「文件」。

2

變化

$extension!=".doc" || $extension!=".doc" 

$extension!=".doc" || $extension!=".docx" 

因爲您的文件類型有img name屬性使用$_FILES['img'],而不是$_FILES['file']

+0

有什麼區別? –

2
  1. 嘗試使用$ _FILES [ 「IMG」]數組訪問上傳的文件屬性(你的 「選擇文件」 輸入名爲 「IMG」)。

  2. 您可以使用「位置」http頭重定向回到源頁面。