PHP,如何获得Mime类型 - 不可能的任务?

时间:2010-05-20 06:51:12

标签: php image get mime-types

在PHP中有没有合适的方法来获取mime类型?

过去几个小时我一直在广泛搜索,似乎有三种主要方式,每种方式都存在问题:

  1. mime_content_type() 这是不推荐使用的,很多时候没有安装,如果安装有时候找不到mime.magic文件。

  2. FILE_INFO 没有安装在我试过的主机上,似乎没有很好的支持。是一个扩展(PECL)。

  3. shell_exec(file -ib。$ file) 在Windows服务器上不起作用。我在linux服务器上试过它,它给了我一个php文件的“image / x-3ds2”。到底是什么!!!

  4. 获取文件的mime类型有什么好的,几乎防弹的方式?

3 个答案:

答案 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 ..