$_FILES["file"]["type"]和end("."


What is the difference between $_FILES["file"]["type"] and end(explode(".", $_FILES["file"]["name"]))

我使用var_dump(@$_FILES['file']['type'])来测试我上传的文件类型

首先,我上传了一个名为"uninstall.exe"的exe file,它返回
"string 'application/octet-stream' (length=24)"
然后,我将这个文件重命名为uninstall.png,它返回
string 'image/png' (length=9)

我的结论是:$_FILES['file']['type']只检查文件扩展名,不检查原始文件类型

以下代码来自w3cschool:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))

我认为上面代码中的$_FILES["file"]["type"]是不必要的,我们可以使用explode()in_array检查文件扩展名

我只是一个php初学者,有人能确认我的想法吗?谢谢!

你完全正确。MIME类型是由客户端提供的,您不能保证它是正确的。对于这个问题,文件扩展名也是如此。如果您需要完全确定,则需要查看文件内容。

如果要确保上传了图像,请使用getimagesize,对于非图像则返回0。

您应该使用GD或Imagick扩展的包装器。一个很好的例子是WideImage。