在PHP中有没有合适的方法来获取mime类型?
过去几个小时我一直在广泛搜索,似乎有三种主要方式,每种方式都存在问题:
mime_content_type() 这是不推荐使用的,很多时候没有安装,如果安装有时候找不到mime.magic文件。
FILE_INFO 没有安装在我试过的主机上,似乎没有很好的支持。是一个扩展(PECL)。
shell_exec(file -ib。$ file) 在Windows服务器上不起作用。我在linux服务器上试过它,它给了我一个php文件的“image / x-3ds2”。到底是什么!!!
获取文件的mime类型有什么好的,几乎防弹的方式?
答案 0 :(得分:2)
作为解决方法,您可以使用http://upgradephp.berlios.de/中的“mime.php”扩展名 如果不可用,它会模拟 mime_content_type()。专为此类案件而制作。
您可以安装私有mime.magic文件并使用ini_set(“mime_magic.magicfile”)强制它。无论如何都推荐这样做,因此您可以使用所需的设置。
答案 1 :(得分:0)
Chris Jean开发a function called get_file_mime_type
首先尝试使用finfo_open
方法,然后回退到mime_content_type
,然后最终回到简单的extension => mime_type
数组。当我的服务器上没有前两个选项时,它对我很有用。节拍必须自己写这个功能!
答案 2 :(得分:0)
您可以使用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 ..