【发布时间】:2020-09-13 15:06:14
【问题描述】:
简介
我有一个从数据库中检索到的 base64 图像字符串:$imageBase64Str
我需要从此内容中检索 mime 并显示图像。这就是以下代码的作用:
function imgMime($imgBytes){
if(is_null($imgBytes)){
return(false);
}
if(strlen($imgBytes)<12){
return(false);
}
$file = tmpfile();
if(!fwrite($file,$imgBytes,12)){
fclose($file);
return(false);
}
$path = stream_get_meta_data($file)['uri'];
$mimeCode=exif_imagetype($path);
fclose($file);
if(!$mimeCode){
return(false);
}
return(image_type_to_mime_type($mimeCode));
}
$imageBytes=base64_decode($imageBase64Str,true);
if(!$imageBytes){
throw new Exception("cannot decode image base64");
}
$imageMime=imgMime($imageBytes);
if(!$imageMime){
throw new Exception("cannot recognize image mime");
}
header('Content-type: '.$imageMime);
echo($imageBytes);
问题
这个解决方案的问题是它需要我将内容的前 12 个字节写入临时文件。我想知道是否有一种简单的方法可以避免这种情况,而无需手动维护一组 mime。另外,我想避免调用外部程序(例如通过exec),以便我的代码保持可移植性。
理想情况
我希望有一个像 exif_imagetype_from_bytes 这样的 php 函数。我的imgMime 函数会更简单:
function imgMime($imgBytes){
if(is_null($imgBytes)){
return(false);
}
if(strlen($imgBytes)<12){
return(false);
}
$mimeCode=exif_imagetype($imgBytes);
if(!$mimeCode){
return(false);
}
return(image_type_to_mime_type($mimeCode));
}
$imageBytes=base64_decode($imageBase64Str,true);
if(!$imageBytes){
throw new Exception("cannot decode image base64");
}
$imageMime=imgMime($imageBytes);
if(!$imageMime){
throw new Exception("cannot recognize image mime");
}
header('Content-type: '.$imageMime);
echo($imageBytes);
编辑:基于所选答案的解决方案
非常感谢@Kunal Raut 的回答让我想出了以下解决方案:
function imgMime($imgBytes){
if(is_null($imgBytes)){
return(false);
}
if(strlen($imgBytes)<12){
return(false);
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime=$finfo->buffer($imgBytes);
if(strncmp($mime, "image/", 6) != 0){
return(false);
}
return($mime);
}
$imageBytes=base64_decode($imageBase64Str,true);
if(!$imageBytes){
throw new Exception("cannot decode image base64");
}
$imageMime=imgMime($imageBytes);
if(!$imageMime){
throw new Exception("cannot recognize image mime");
}
header('Content-type: '.$imageMime);
echo($imageBytes);
恕我直言,这个解决方案要优雅得多。
【问题讨论】:
-
简短回答:该功能不存在。是的,这很糟糕。长答案:garykessler.net/library/file_sigs.html