【发布时间】:2017-02-23 18:05:58
【问题描述】:
我将数千张图片以二进制格式存储在数据库中。我想用 PHP GD 确定 MIME 类型,而不是使用表中的另一列。
不读取和写入临时图像文件的最佳方法是什么?
【问题讨论】:
-
如果有临时文件,请显示代码。
标签: php mysql sql gd mime-types
我将数千张图片以二进制格式存储在数据库中。我想用 PHP GD 确定 MIME 类型,而不是使用表中的另一列。
不读取和写入临时图像文件的最佳方法是什么?
【问题讨论】:
标签: php mysql sql gd mime-types
【讨论】:
我知道这有点老了,但我一直在寻找一种解决方案来从 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-type。就我而言,我在 http 内容类型标头中使用 $mimetype,其中编码很有帮助。
【讨论】: