我有一些存储在 bin 文件中的图片,我想要检查头部以确定格式(jpg、png等)。
我不想使用临时文件!我有一个使用临时文件的解决方案。
我看到大多数人没有理解这个问题 :)(问题是如何验证缓冲区中的二进制数据,而不是磁盘上的文件)。
我曾经遇到过同样的问题,最终用以下方法解决了:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($rawImage);
比特位从以下开始:
$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%的情况。因此,将文件的前几个字节与这些字符串进行比较,你就可以得到答案。
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;
}
mime_content_type()
函数获取文件的 MIME 格式。使用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)安装到早期版本中。
http://php.net/manual/en/function.getimagesize.php
"索引2是IMAGETYPE_XXX常量之一,指示图像的类型。"
为什么不直接检查文件扩展名?:)
另一种选择
if(exif_imagetype($filepath) == IMAGETYPE_JPEG){
echo 'This is a JPEG image';
}
application/pdf; charset=binary
的东西,然后可以这样提取:list($mime, $raw_charset) = explode(';', $finfo->buffer($rawImage));
然后(如果需要字符集):$charset = explode('=', trim($raw_charset))[1];
- Cédric Françoys