通过反复试验,似乎文件必须大于或等于 12 字节才能避免“读取错误!”。以下是一个解决方法,以避免抛出错误
// exif_imagetype 在文件太小的情况下会抛出“读取错误!”
if (filesize($uploadfile) > 11)
$mimetype = exif_imagetype($uploadfile);
else
$mimetype = false;
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
exif_imagetype — 确定图像的类型
exif_imagetype() 读取图像的前几个字节并检查其签名。
exif_imagetype() 可用于避免对不支持文件类型的其他 exif 函数的调用,或与 $_SERVER['HTTP_ACCEPT'] 结合使用,以检查查看者是否能够在浏览器中看到特定图像。
filename
当找到正确的签名时,将返回相应的常量值,否则返回值为 false
。返回值与 getimagesize() 在索引 2 中返回的值相同,但 exif_imagetype() 速度更快。
定义了以下常量,它们表示可能的 exif_imagetype() 返回值
值 | 常量 |
---|---|
1 | IMAGETYPE_GIF |
2 | IMAGETYPE_JPEG |
3 | IMAGETYPE_PNG |
4 | IMAGETYPE_SWF |
5 | IMAGETYPE_PSD |
6 | IMAGETYPE_BMP |
7 | IMAGETYPE_TIFF_II (intel 字节顺序) |
8 |
IMAGETYPE_TIFF_MM (motorola 字节顺序) |
9 | IMAGETYPE_JPC |
10 | IMAGETYPE_JP2 |
11 | IMAGETYPE_JPX |
12 | IMAGETYPE_JB2 |
13 | IMAGETYPE_SWC |
14 | IMAGETYPE_IFF |
15 | IMAGETYPE_WBMP |
16 | IMAGETYPE_XBM |
17 | IMAGETYPE_ICO |
18 | IMAGETYPE_WEBP |
19 | IMAGETYPE_AVIF |
注意:
如果 exif_imagetype() 无法从文件读取足够字节以确定图像类型,它将发出
E_NOTICE
并返回false
。
版本 | 描述 |
---|---|
7.1.0 | 添加了 WebP 支持。 |
8.1.0 | 添加了 AVIF 支持。 |
示例 #1 exif_imagetype() 示例
<?php
if (exif_imagetype('image.gif') != IMAGETYPE_GIF) {
echo 'The picture is not a gif';
}
?>
通过反复试验,似乎文件必须大于或等于 12 字节才能避免“读取错误!”。以下是一个解决方法,以避免抛出错误
// exif_imagetype 在文件太小的情况下会抛出“读取错误!”
if (filesize($uploadfile) > 11)
$mimetype = exif_imagetype($uploadfile);
else
$mimetype = false;
因为我只想从内存字符串中检查 jpeg 或 png,所以这是我的 2 个函数,它们很快并且没有依赖项
<?php
function is_jpeg(&$pict)
{
return (bin2hex($pict[0]) == 'ff' && bin2hex($pict[1]) == 'd8');
}
function is_png(&$pict)
{
return (bin2hex($pict[0]) == '89' && $pict[1] == 'P' && $pict[2] == 'N' && $pict[3] == 'G');
}
?>
Windows 用户:如果您遇到致命错误“Fatal error: Call to undefined function exif_imagetype()”,并且您已启用 php_exif.dll,请确保您也启用了 php_mbstring.dll。您必须将 mbstring 放置在 php.ini 中的 exif 之前,例如:
extension=php_mbstring.dll
extension=php_exif.dll
您可以通过调用 phpinfo() 并搜索 exif 来检查是否已成功。
如果函数 exif_imagetype() 不可使用,
您可以尝试以下解决方法
if ( ! function_exists( 'exif_imagetype' ) ) {
function exif_imagetype ( $filename ) {
if ( ( list($width, $height, $type, $attr) = getimagesize( $filename ) ) !== false ) {
return $type;
}
return false;
}
}
为了检查文件是否为图像,我使用了这个
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;
}
libexif 也可用于从 id3 标签中解析图像信息
exif_read_data("mp3_with_2.4ID3TAGS, '', true, false);