2011-04-10 153 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代码)