2011-04-10 188 views
1

一些奇怪的情況,當我嘗試一個簡單的PHP代碼來檢查文件類型,它無法通過。下面的代碼有任何錯誤?提前致謝。PHP文件類型檢查

if(($_FILES["file"]["type"]!="image/jpeg")|| 
      ($_FILES["file"]["type"]!="image/gif")|| 
      ($_FILES["file"]["type"]!="image/png")){ 
      echo "File must be in format of jpeg,gif or png."; 
     } 
+0

您在您的html中擁有'enctype =「multipart/form-data」'形式正確嗎? 如果是,你可以print_r $ _FILES然後尋找@deceze給出的答案。 – arma 2011-04-10 02:08:28

回答

5

「不是JPEG」, 「不是一個GIF」, 「不是PNG」。這些條件中的至少兩個具有true。由於您使用的是||,如果其中的任何true,則整個if條件是true

你要找的「不是JPEG 不是GIF 沒有PNG」

除此之外,你可以用更簡潔的形式:

!in_array($_FILES["file"]["type"], array('image/jpeg', 'image/gif', 'image/png')) 

此外,$_FILES["file"]["type"]是,你不應該相信用戶提供的信息。您應該嘗試從文件本身中找出MIME類型。例如,請參閱How to get the content-type of a file in PHP?

+0

LoL我很笨,看不懂自己哈哈 – 2011-04-10 02:08:12

1

mime_content_type( 'php.gif')將輸出圖像/ GIF

+0

感謝提醒我關於使用MIME作爲欺騙提及這一點的類型。多謝你們。 – 2011-04-10 02:10:29

1

您的條件有誤,您希望「& &」而不是「||」。此外,$_FILES["file"]["type"]是瀏覽器報告的類型,因此它可能不正確或丟失。您是否嘗試過記錄它以查看瀏覽器正在發送的內容?

如果使用FileInfo等來檢查類型,或者看看GD或其他圖像處理擴展程序是否接受它,則會更好。

0

我更喜歡getimagesize(),以避免MIME類型,特別是JPEG的問題,其中有很多MIME類型是可能的(正如Anomie所寫的$_FILES["file"]["type"]是瀏覽器報告的類型)。

嘗試一下,採取一些奇特的文件類型,並給它一個像.gif或.jpg的擴展名。

$_FILES["file"]["type"]會報告像'image.gif'或'image.jpeg',但getimagesize()將返回false,因爲它檢測到該文件不是圖像。

這可以用來上傳例如PHP腳本到服務器上。

另請注意:永遠不要相信任何上傳的文件,圖片可能是正確的,但也可以在註釋中包含PHP代碼。因此,請確保這些圖像永遠不會被服務器上的任何PHP腳本包含(另外,您可以檢查圖像是否爲PHP代碼)