如果文件上传到服务器,有没有办法使用PHP,以确保它实际上是一张图片,而不仅仅是一个.jpg或.gif扩展名的文件?
答案 0 :(得分:14)
使用GD库的(部分)。
array getimagesize ( string $filename [, array &$imageinfo ] )
如果没有图像,则数组的第一个元素为0。 PHP: getimagesize
如果您没有安装GD(大部分时间都可以),您可以将文件标题读作Shane mentioned。
编辑: 实际上,正如Neal在评论中指出的那样, GD库甚至不需要使用此功能。所以使用它。
答案 1 :(得分:6)
检查文件是否为图像的最佳方法
function is_image($path)
{
$a = getimagesize($path);
$image_type = $a[2];
if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
{
return true;
}
return false;
}
更多:http://www.binarytides.com/php-check-if-file-is-an-image/
答案 2 :(得分:4)
最有效的方法是查看文件的开头字节并测试'magic number'文件说明符。 Here is a list of magic numbers
答案 3 :(得分:0)
有关记录:现在在2013年以后我们可以:
最多兼容性(如果您没有GD库) 使用始终可用的mime-content-type((PHP 4> = 4.3.0,PHP 5))
$type = mime_content_type($filename);
if (strstr($type, 'image/'))
{
echo 'is image';
}
答案 4 :(得分:0)
标头检查不足以检查图像文件的有效性。
PHP文档明确表示您不应该使用 /**
* Returns TRUE if $path is a valid Image File
*
* @param string $path
* @return bool
*/
public static function isImage(string $path)
{
if (!is_readable($path)) {
return false;
}
// see https://www.php.net/manual/en/function.exif-imagetype.php for Constants
// adjust this array to your needs
$supported = [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG];
$type = exif_imagetype($path);
// $type can be valid, but not "supported"
if (!in_array($type, $supported)) {
return false;
}
// check the image content, header check is not enough
$image = false;
switch ($type) {
case IMAGETYPE_GIF:
$image = @imagecreatefromgif($path);
break;
case IMAGETYPE_PNG:
$image = @imagecreatefrompng($path);
break;
case IMAGETYPE_JPEG:
$image = @imagecreatefromjpeg($path);
break;
}
return (!!$image);
}
来检查给定文件是否为有效映像。参见https://www.php.net/manual/en/function.getimagesize.php
我使用以下功能来验证图像文件:
{{1}}