PHP 文件类型检查
Posted
技术标签:
【中文标题】PHP 文件类型检查【英文标题】:PHP files type checking 【发布时间】:2011-08-02 07:54:14 【问题描述】:当我尝试使用简单的 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.";
【问题讨论】:
您的 html 表单中有enctype="multipart/form-data"
对吗?如果是,你可以 print_r $_FILES 然后寻找@deceze给出的答案。
【参考方案1】:
我更喜欢getimagesize() 来避免 mime 类型的问题,尤其是 JPEG,其中可能有很多 mime 类型。(正如 Anomie 所写,$_FILES["file"]["type"]
是浏览器报告的类型)。
试试看,采用一些奇异的文件类型,并给它一个扩展名,如 .gif 或 .jpg。
$_FILES["file"]["type"]
将报告类似 'image.gif' 或 'image.jpeg' 的内容,但 getimagesize() 将返回 false
,因为它检测到文件不是图像。
这可用于上传,例如PHP 脚本到服务器上。
另请注意:永远不要相信任何上传的文件,图像可能是正确的,但也可以在 cmets 中包含 PHP 代码。因此,请确保这些图像永远不会包含在您服务器上的任何 PHP 脚本中。(此外,您可以检查图像中的 PHP 代码)
【讨论】:
【参考方案2】:你的条件是错误的,你想要“&&”而不是“||”。此外,$_FILES["file"]["type"]
是浏览器报告的类型,因此很可能不正确或丢失。您是否尝试过记录它以查看浏览器到底发送了什么?
使用FileInfo 等检查类型,或查看GD 或其他图像处理扩展程序是否接受它会更好。
【讨论】:
【参考方案3】:“不是 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?。
【讨论】:
【参考方案4】:mime_content_type('php.gif') 将输出图像/gif
【讨论】:
感谢提醒我使用 mime 检查的类型,因为 deceze 也提到了这一点。谢谢大家。以上是关于PHP 文件类型检查的主要内容,如果未能解决你的问题,请参考以下文章