PHP,如何获得 Mime 类型 - 不可能的任务?
Posted
技术标签:
【中文标题】PHP,如何获得 Mime 类型 - 不可能的任务?【英文标题】:PHP, How to get Mime Type - Mission Impossible? 【发布时间】:2011-02-21 17:29:34 【问题描述】:在 php 中有什么不错的方法来获取 mime 类型吗?
过去几个小时我一直在广泛搜索,似乎有三种主要方式,每种方式都有问题:
mime_content_type() 这已被弃用,很多时候都没有安装,如果安装了有时会找不到 mime.magic 文件。
文件信息 没有安装在我试过的主机上,似乎没有很好的支持。是扩展 (PECL)。
shell_exec(file -ib .$file) 不适用于 Windows 服务器。我在 linux 服务器上尝试过它,它给了我一个 php 文件的“image/x-3ds2”。这是什么鬼!!!
什么是获取文件的 mime 类型的好方法?
【问题讨论】:
How do I find the mime-type of a file with php? 的可能重复项 呃,我有点困惑。我实际上读过那篇文章,但我找不到任何好的答案,我的意思是,我找不到任何可接受的答案,这是否意味着,如果还没有绝对答案,我以后不能发布任何类似的问题?什么是规则?我想知道,以便我可以关注=) 而且我认为这篇文章 (***.com/questions/134833/…) 是 1 年前提出的,我怀疑它会有任何新的答案 =( 我使用 Apache 的 mime.types 将扩展映射到 mime 类型。 您期待什么样的文件?图片?具体文件? 【参考方案1】:作为解决方法,您可以使用来自http://upgradephp.berlios.de/ 的“mime.php”扩展名 如果不可用,它会模拟 mime_content_type()。专为此类情况而设计。
您可以安装您的私有 mime.magic 文件并使用 ini_set("mime_magic.magicfile") 强制它。无论如何都建议这样做,因此您可以使用所需的设置。
【讨论】:
mime.php 未完成,我刚刚测试它,它不工作:(【参考方案2】:Chris Jean 开发了a function called get_file_mime_type
,它首先尝试使用finfo_open
方法,然后回退到mime_content_type
,最后回退到一个简单的extension => mime_type
数组。当我的服务器上没有前两个选项时,它对我很有效。不用自己编写函数!
【讨论】:
【参考方案3】:您可以使用magic numbers,查阅其他一些文件签名列表(like this one here),然后检查二进制数据的第一个字节。
function getfiletype($file)
$handle = @fopen($file, 'r');
if (!$handle)
throw new Exception('File error - Can not open File or file missing');
$types = array( 'jpeg' => "\xFF\xD8\xFF",
'gif' => 'GIF',
'bmp' => 'BM',
'tiff' => '\x49\x20\x49',
'png' => "\x89\x50\x4e\x47\x0d\x0a",
'psd' => '8BPS',
'swf' => 'FWS');
$bytes = fgets($handle, 8);
$filetype = 'other';
foreach ( $types as $type => $header )
if ( strpos( $bytes, $header ) === 0)
$filetype = $type;
break;
fclose($handle);
return $filetype;
这实际上是 file_info() 的一个非常简单的替换函数,它的操作方式几乎相同,但在扩展(和更低)级别上。
替代方案是使用已经制作的外部 php 类,例如 this one ..
【讨论】:
以上是关于PHP,如何获得 Mime 类型 - 不可能的任务?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony:如何在 ppt 和 pptx 上获得正确的 mime 类型