在PHP中获取照片文件扩展名类型的最佳方法

时间:2009-08-15 04:26:41

标签: php

我正在我的网站上重新构建我的照片上传部分,我正尽力学习,所以我可以安全地做到这一点,但也有最好的表现。我的网站每分钟上传15-20张照片

这种方法对于获取照片的文件类型是否可靠,如jpg,gif,png?

 $fileType = $_FILES['image']['type'];

4 个答案:

答案 0 :(得分:13)

文件扩展名是或至少可以。绝对不要依赖/信任用户提交的数据。另外,正如PHP手册所述:

  

$ _ FILES ['userfile'] ['type'] -   文件的mime类型,如果浏览器提供了此信息。一个例子是“image / gif”。但是,在PHP方面没有检查这个mime类型,因此不会将其值视为理所当然。

这不可靠。

这是一个更好的方法:

PHP的getimagesize()函数返回有关图像的数字索引数据数组,索引2是指示图像类型的IMAGETYPE_XXX常量之一(a full list of which is available here)。然后可以在许多GD族函数中使用它们,两个相关的函数是image_type_to_extension()image_type_to_mime_type()

所以,你可以轻松地沿着这些方向做点什么:

$imageData = getimagesize($_FILES['userfile']['tmp_name']);
// $imageData[2] will contain the value of one of the constants
$mimeType = image_type_to_mime_type($imageData[2]);
$extension = image_type_to_extension($imageData[2]);

虽然如果您有exif扩展名可用,[exif_imagetype()][5]函数将返回与getimagesize()的索引2完全相同的结果,但速度要快得多。

我使用GD方法作为我的主要示例,因为它们更常见于PHP安装中。但Imagick扩展也提供类似的功能,你也可以使用fileinfo扩展名验证mime类型(包括自5.3以后,btw)。

答案 1 :(得分:2)

exif_imagetype()是检查给定文件是否为有效图像文件的最安全,最快速和最可靠的方法,它也适用于远程URL。

  

返回值与getimagesize()在索引2中返回的值相同   但是exif_imagetype()要快得多。

$type = @exif_imagetype($_FILES['image']['tmp_name']);

if (($type >= 1) && ($type <= 3))
{
    echo 'Valid image (GIF, JPG or PNG).';
}

else
{
    unlink($_FILES['image']['tmp_name']); // delete it
}

答案 2 :(得分:2)

首先尝试getimagesizeexif_imagetype()

如果它不返回['mime'],请尝试finfo_file(如果extension_loaded('fileinfo')),

如果仍然没有结果,请尝试mime_content_type(如果function_exists('mime_content_type'))。

如果您不想要mime类型,但只是文件扩展名,请使用pathinfo($path, PATHINFO_EXTENSION)

答案 3 :(得分:1)

正如the doc所说,

  

文件的mime类型,如果浏览器提供此信息。 [...]然而,在PHP方面没有检查这个mime类型,因此不会将其值视为理所当然

换句话说,你不应该相信它,因为我可以上传我想要的任何东西,并让它看起来像你的jpeg。

为了确保上传的文件实际上是一张图片,我过去曾亲自使用Imagick::identifyImage并获得了出色的效果。 GD可能具有相同的功能。

或者您可以使用fileinfo扩展来获取mime类型服务器端,更具体地说finfo_file()