PHP:二进制图像数据,检查图像类型

16

我有一些存储在 bin 文件中的图片,我想要检查头部以确定格式(jpg、png等)。

我不想使用临时文件!我有一个使用临时文件的解决方案。

7个回答

55

我看到大多数人没有理解这个问题 :)(问题是如何验证缓冲区中的二进制数据,而不是磁盘上的文件)。

我曾经遇到过同样的问题,最终用以下方法解决了:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($rawImage);

2
如果您使用的是PHP > 5.3,那么这个解决方案是最好的。 - djleop
2
考虑到 PHP 的当前状态,这个应该比我的回答得到更多的赞同,毕竟 5.3 已经有些过时了。 - Wrikken
你会得到类似于 application/pdf; charset=binary 的东西,然后可以这样提取: list($mime, $raw_charset) = explode(';', $finfo->buffer($rawImage)); 然后(如果需要字符集): $charset = explode('=', trim($raw_charset))[1]; - Cédric Françoys

27

比特位从以下开始:

$JPEG = "\xFF\xD8\xFF"
$GIF  = "GIF"
$PNG  = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"
$BMP  = "BM"
$PSD  = "8BPS"
$SWF  = "FWS"

其他的我现在不清楚,但是三种常见格式(jpeg, gif, png)通常覆盖了99%的情况。因此,将文件的前几个字节与这些字符串进行比较,你就可以得到答案。


2
你能举个例子说明如何使用PHP检查这些内容与某些二进制数据的匹配吗?谢谢。 - DonutReply
3
@DonutReply - 仅供搜索的人使用:https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 - CodeBrauer
1
你有关于查找图像结尾的最后几位的任何信息吗? - Daniel
@Daniel 已经找到了结束字节。我也在寻找同样的东西。 - Murali

5
这是根据Wrikken所描述的函数的实现:
function getImgType($filename) {
    $handle = @fopen($filename, 'r');
    if (!$handle)
        throw new Exception('File Open Error');

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS');
    $bytes = fgets($handle, 8);
    $found = 'other';

    foreach ($types as $type => $header) {
        if (strpos($bytes, $header) === 0) {
            $found = $type;
            break;
        }
    }
    fclose($handle);
    return $found;
}

1
文件是正在上传中还是已经存在于文件系统中?
尝试使用 mime_content_type() 函数获取文件的 MIME 格式。

1

使用fileinfo PHP扩展:

http://de.php.net/manual/en/function.finfo-file.php

它使用“file”*nix命令来可靠地确定给定文件的MIME类型:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);

这个扩展是随 PHP 5.3 一起发布的,或者可以从 PECL(pecl install fileinfo)安装到早期版本中。


0

查看函数文档,上面写着不要将其用于“是否为图像”的检查。 - Kirzilla

-1

为什么不直接检查文件扩展名?:)

另一种选择

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){
    echo 'This is a JPEG image';
}

那么你的大部分GIF文件实际上并不是GIF格式的吗?除非你正在处理用户上传内容,否则这真的没有任何理由不能工作,即使在这种情况下,你可能也没有什么可担心的。 - Dutchie432
2012年,一些用户认为他们可以通过重命名文件来转换图像...因此,这并不可靠。 - djleop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接