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

8
有没有在PHP中获取MIME类型的好方法?
我已经搜索了几个小时,似乎有三种主要方法,每种方法都存在问题:
1. mime_content_type() 这已经被弃用,很多时候没有安装,如果安装了,有时会找不到mime.magic文件。
2. file_info 在我尝试的主机上没有安装,看起来支持也不是很好。它是一个扩展(PECL)。
3. shell_exec(file -ib . $file) 在Windows服务器上无法工作。我在Linux服务器上尝试了一下,它给我的php文件返回了“image/x-3ds2”。这是什么鬼!
有没有一个好的、几乎可以保证的方法来获取文件的MIME类型呢?

可能是重复的问题:如何使用PHP查找文件的MIME类型? - Stefan Gehrig
嗯,我有点困惑。我确实读了那篇帖子,但是我找不到任何好的答案,我的意思是,我找不到任何可接受的答案,这是否意味着,如果还没有绝对的答案,我将来就不能发类似的问题了?SO规则是什么?我想知道,这样我就可以遵循规则 =) - mysqllearner
我认为这篇帖子(https://dev59.com/ZHVC5IYBdhLWcg3w9GLM)是一年前发布的,我怀疑不会有任何新的答案=( - mysqllearner
我使用Apache的mime.types将扩展名映射到MIME类型。 - Artefacto
1
你期望的是哪种类型的文件?图片?特定的文档? - Salman A
是的,图片。白名单文件格式:jpg、gif和png。黑名单:php、asp、exe等。 - mysqllearner
3个回答

2
作为解决方法,您可以使用来自http://upgradephp.berlios.de/的“mime.php”扩展程序。 如果 mime_content_type()不可用,则会模拟它。特别为此类情况而制作。
您可以安装私有mime.magic文件并使用ini_set(“mime_magic.magicfile”)强制执行它。无论如何,这都是推荐的,因此您可以获得所需的设置。

mime.php还没有完成,我刚刚测试了一下,它不起作用 :( - Jerome Ansia

0

你可以使用 魔数,查询一些其他文件签名列表 ( 像这里的列表 ),然后检查二进制数据的第一个字节。

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


0

Chris Jean开发了一个名为{{link1:get_file_mime_type的函数}},它首先尝试使用finfo_open方法,然后退回到mime_content_type,最后退回到简单的extension => mime_type数组。当我的服务器上前两个选项不可用时,它对我很有帮助。比起自己编写这个函数,这样做更好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接