2011-04-22 160 views
3

我希望人們能夠將zip文件上傳到我的服務器。我有一個表格供他們上傳,並重定向到上傳頁面。我可以成功上傳圖片(PNG和JPG格式),但每當我嘗試一個zip文件時,我會在第4-8行上看到幾個「未定義的索引錯誤」。這是我的代碼。如果你想看看這個網站,應該可以在gregsminecraft.dyndns.org:25566/file.php編輯:我相信它不接受大的zip文件,因爲我用較小的文件嘗試了它,它工作。有沒有辦法接受更大的zip文件?如何使用php上傳zip文件?

if ((($_FILES["file"]["type"] == "application/zip") 
|| ($_FILES["file"]["type"] == "application/x-zip-compressed") 
|| ($_FILES["file"]["type"] == "multipart/x-zip") 
|| ($_FILES["file"]["type"] == "application/x-compressed") 
|| ($_FILES["file"]["type"] == "application/octet-stream")) 
&& ($_FILES["file"]["size"] < 20971520)) 
    { 
    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("upload/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"], 
     "upload/" . $_FILES["file"]["name"]); 
     echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
     } 
    } 
    } 
else 
    { 
    echo "Invalid file"; 
    } 
+0

我只是測試您所提供的網址,並得到了以下的輸出: 上傳:iPhone intro.zip 類型:application/X-ZIP壓縮 尺寸:158.626953125 KB 臨時文件:/私營/ var/tmp中/ php0ZyEoi 在存儲:上傳/ iPhone intro.zip – 2011-04-22 17:47:27

回答

3

你說上傳後上傳表單重定向?請記住,當腳本退出時,PHP會刪除所有上載的文件,除非您已採取措施保存該文件。如果你的表單發佈到(比如說)「upload.php」然後重定向到「handle_upload.php」,你必須在「upload.php」腳本中實際處理上傳,否則文件就不存在了。

同樣,不要相信$ _FILES數組中的參數['type']['name']。這是用戶提供的數據,可以很容易地被破壞。您還使用用戶提供的文件名將文件存儲在您的服務器上。沒有什麼說用戶不能破解上傳表單並用MIME類型的「application.zip」調用他們的文件「../../../../etc/passwd」。你的腳本會高興地接受並覆蓋你的服務器的密碼文件。

處理上傳,錯誤檢查的正確方法是:

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    if (isset($_FILES['file'])) { 
      if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { 
       ... file was succesfully uploaded, process it 
      } else { 
       ... file upload failed, output error message, etc... 
    } else { 
     ... no upload at all, not even an attempt 
    } 
} else { 
    .... not in a POSt environment, so can't possibly have a file upload ... 
}