我以二进制格式将数千张图像存储在数据库中。我想用 PHP GD 确定 MIME 类型,而不是使用表中的另一列。
在不读取和写入临时图像文件的情况下执行此操作的最佳方法是什么?
我以二进制格式将数千张图像存储在数据库中。我想用 PHP GD 确定 MIME 类型,而不是使用表中的另一列。
在不读取和写入临时图像文件的情况下执行此操作的最佳方法是什么?
我知道这有点老了,但我一直在寻找一种解决方案来从 mysql 的 BLOB 上解决这个问题,这对我来说是有效的方式。我希望它也对其他人有所帮助。我不知道哪种方式最适合性能,但值得测试。
$finfo = new finfo(FILEINFO_MIME);
$mimeType = $finfo->buffer($myBlobHere);
OP 只询问图像类型。对于图像类型,getimagesizefromstring()
效果很好,但finfo
也适用于其他文件类型。不幸的是,finfo
并非在所有服务器上都可用。它自 PHP 5.3.0 起就包含在内,但通常在 Windows 系统上被禁用。因此,我选择首先使用getimagesizefromstring
,如果它无法检测到 mimetype,我检查finfo
-class,如果它存在,我尝试 finfo。
这是组合解决方案:
$imagesize = getimagesizefromstring($blobVal);
if($imagesize!==false && isset($imagesize['mime']))
$mimetype = $imagesize['mime'];
elseif(class_exists('finfo'))
{
$finfo = new finfo(FILEINFO_MIME);
$mimetype = $finfo->buffer($blobVal);
}
else
$mimetype = "application/octet-stream";
在这里,我使用默认的 mimetype 作为后备,您可能需要调整它。
注意:使用finfo
, 您可能想要FILEINFO_MIME_TYPE
代替FILEINFO_MIME
,因为后者还包含编码,而FILEINFO_MIME_TYPE
仅返回 mime 类型。就我而言,我$mimetype
在 http 内容类型标头中使用,其中编码很有帮助。