2011-04-09 82 views
0

在我的網站上,我有一個頁面,用戶可以在上傳文件的同時添加新聞帖子。我允許他們上傳一個圖像和一個聲音文件。他們不需要添加文件,如果他們不想要的話,或者他們可以添加一個,如果他們想要的話。我遇到的問題是我的腳本只在用戶選擇兩個文件時才起作用。如果他們不選擇或者只選擇一個,那麼腳本會吐出「無效文件」,因爲它找不到沒有被選中的文件。上傳多個文件時出現問題PHP

我試着使用:

if (isset($_FILES['filetoupload1'])) { 
    if (($_FILES["filetoupload1"]["type"] == "image/gif") 
     || ($_FILES["filetoupload1"]["type"] == "image/jpeg") 
     || ($_FILES["filetoupload1"]["type"] == "image/pjpeg") 
     || ($_FILES["filetoupload1"]["type"] == "image/png") 
     || ($_FILES["filetoupload1"]["type"] == "image/jpg") 
    ) { 
     if ($_FILES["filetoupload1"]["error"] > 0) { 
      echo "Return Code: " . $_FILES["filetoupload1"]["error"] . "<br />"; 
     } else { 
     if (file_exists("media/" . $_FILES["filetoupload1"]["name"])) { 
       echo $_FILES["filetoupload1"]["name"] . " already exists. "; 
      } 
      move_uploaded_file(
       $_FILES["filetoupload1"]["tmp_name"], 
       "media/" . $_FILES["filetoupload1"]["name"] 
      ); 
     } 
    } else { 
     echo "Invalid file"; 
    } 
} 


if (isset($_FILES['filetoupload2'])) { 
    if ($_FILES["filetoupload2"]["type"] == "audio/mp3") { 
     if ($_FILES["filetoupload2"]["error"] > 0) { 
      echo "Return Code: " . $_FILES["filetoupload2"]["error"] . "<br />"; 
     } else { 
     if (file_exists("media/" . $_FILES["filetoupload2"]["name"])) { 
       echo $_FILES["filetoupload2"]["name"] . " already exists. "; 
      } 
      move_uploaded_file(
       $_FILES["filetoupload2"]["tmp_name"], 
       "media/" . $_FILES["filetoupload2"]["name"] 
      ); 
     } 
    } else { 
     echo "Invalid file"; 
    } 
} 

然後

if((isset($_FILES['filetoupload1'])) && (isset($_FILES['filetoupload2']))) { }

第一和第二載腳本之前,如果用戶已經選擇兩種圖像和音頻文件。換句話說,它是這樣做的:

if filetoupload1 isset then run upload script that filters images. 
if filetoupload2 isset then run upload script that filters audio. 
if filetoupload1 AND filetoupload2 isset then run both upload scripts. 

我把它設置成這樣。以上應該允許文件上傳的所有組合。對?但它不工作,所以..

現在我不知道該怎麼做。這裏是音頻的上傳腳本,圖像幾乎是一樣的:

有人可以告訴我我做錯了,請!

+0

請說明您是「不工作」的意思。輸出,預期結果,實際結果等。 – cweiske 2011-04-09 15:26:48

+0

我收到錯誤:無效的文件。 如果沒有選擇這兩個文件,我會得到兩個「無效文件」錯誤。 它只適用於兩個文件都被選中的情況。但我希望用戶能夠選擇他們上傳的新聞發佈內容,因爲他們可能並不總是有聲音片段或圖像,或者任何其他新聞發佈。 – nutman 2011-04-09 16:08:07

+0

如果沒有上傳文件,您還有其他迴應無效文件。如果您沒有上傳無效文件兩次,這是合乎邏輯的。你的代碼允許你想要達到的目標。只要刪除回聲或如果你願意在它的位置做些事情。 – 2011-04-09 16:43:43

回答

2

"I get the error: Invalid file"

這是正確的,因爲你的代碼只是這樣做。 不檢查文件是否設置,但如果$_FILES["filetoupload1"]["type"]不是空的。

+0

我不認爲你理解我。或者我不瞭解你。我對我的問題進行了編輯以使其更清晰 – nutman 2011-04-09 15:21:12

+0

您發佈的新源代碼實際上有助於更好地理解它。 – cweiske 2011-04-09 15:27:29

1

你的腳本,使您的服務器容易受到惡意用戶爲上的任何文件能跺腳Web服務器可以訪問:

$_FILES[...]['name'] - user supplied 
$_FILES[...]['type'] - user supplied 

你信任該客戶端已提供正確的MIME類型的文件,但沒有任何東西阻止某人僞造請求並上傳「virus.exe」並將MIME類型設置爲「image/jpeg」。同樣,由於遠程文件名受用戶控制,因此可能會被惡意數據破壞。試想一下:

$_FILES['picture']['type'] = 'image/gif' 
$_FILES['picture']['name'] = 'remote_server_control.php' 

完全合法的根據你的腳本,因爲MIME類型是「正確的」,但你現在已經把用戶提供的PHP腳本您的服務器上,並與他們採取總量控制您的網站和/或服務器。

千萬不要相信$_FILES陣列中的數據。始終通過服務器端實用程序確定MIME類型。如果腳本只能處理圖像,請使用getimagesize()。另外,請勿使用用戶提供的文件名。使用確定的服務器端來給文件一個名稱,如數據庫auto_increment ID號。即使你的代碼不允許覆蓋現有的文件,只是想出一個新的名字和繁榮......新版本的遠程接管腳本是微不足道的。

1

我建議你添加一個隱藏的文本,這個隱藏將檢查女巫上傳域是活動的,你做這個檢查使用javascript:

<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<style> 

</style> 

<script type="text/javascript"> 
function uploadForm() 
{ 
var size = 0; 
var x = document.forms["myForm"]["upload1"].value.length; 
var y = document.forms["myForm"]["upload2"].value.length; 
if (x > 0) 
    { 
    size = 3; 
    } 
if (y > 0) 
{ 
    size += 2; 
} 
return size; 
} 
</script> 

</head> 
<body> 


<form name="myForm" action="" method="GET" onsubmit="chose.value = uploadForm()"> 
<input type="file" name="upload1"><br> 
<input type="file" name="upload2"><br> 
<input type="hidden" name="chose" value=""><br> 
<input type="submit" value="Submit"> 
</form> 


</body> 
</html> 

現在,當你收到表格,你必須檢查值選擇了申請,如果其2,即意味着圖像字段不爲空,3音頻申請不爲空,5都沒有空:

<?php 
switch($_GET["chose"]) 
{ 
case 2: 
// 
break; 
case 3; 
// 
break; 
case 5: 
// 
break; 
default: 
// here the user doesn't use any field 

} 
?> 
+0

我認爲這會起作用,但交換機沒有被觸發。我已經三重檢查了代碼。唯一我不明白的是javascript。該javascript代碼如何在地址字符串中放置一個值,以便能夠$ _GET呢? – nutman 2011-04-09 17:07:06

+0

我們檢查upload1的提交長度,如果它大於0,這意味着用戶放了一些東西,所以我們在這裏添加2到大小變量,同樣的東西適用於第二個字段,除了我們在這裏添加3. 當表單提交時我們執行這個函數將會返回0,2,3或者5,這取決於用戶使用什麼或者什麼都沒有提交,這個值將被分配給選擇隱藏的字段並且將它與在服務器端,我們檢查選擇的價值,我們決定取決於它的價值,我希望你能理解我,我很抱歉,因爲我不是英語母語的人。 – SIFE 2011-04-09 19:29:57