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 类型 - 不可能的任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得具有 Uri 的文件的 mime 类型?

Symfony:如何在 ppt 和 pptx 上获得正确的 mime 类型

如何检测 Angular 9 应用程序中的 MIME 类型错误并获得通知?

如何使用 php 在文件上设置 mime 类型?

PHP:如何正确检查文件的 MIME 类型?

在没有 PECL 扩展的 PHP5 中获取本地文件的 MIME 类型?