给 PHP 添加 MIME 类型知识

Posted

技术标签:

【中文标题】给 PHP 添加 MIME 类型知识【英文标题】:Add MIME type knowledge to PHP 【发布时间】:2019-08-13 07:45:41 【问题描述】:

我知道 UNIX 命令 file 可以检测文件的 mime 类型,我可以通过 php 执行该命令(如 here):

$content_type = exec("file -bi " . escapeshellarg($filepath));

我也知道

$fi = new finfo();
echo $fi->file($filename, FILEINFO_MIME_TYPE) . PHP_EOL;

echo mime_content_type($filename) . PHP_EOL;

两种 PHP 内置解决方案产生相同的输出。但是,Linux file 命令对某些格式的了解更多。

AMR 音频文件在所有三种方法中都报告为application/octet-stream。然后我将文件魔法添加到file命令的数据库中:

$ cat /etc/magic
0   string  #!AMR\n Adaptive Multi-Rate Audio Codec
!:mime  audio/amr

$ file -bi test115.amr 
audio/amr; charset=binary

但是,PHP 仍然报告application/octet-stream

我认为 PHP-builtin 和 file 以某种方式使用相同的数据库。如何训练 PHP 了解 AMR 文件的 MIME 类型?

【问题讨论】:

【参考方案1】:

PHP 似乎使用自己的捆绑数据库进行文件信息查找;您可以通过将第二个参数添加到 new finfo 调用或设置 MAGIC 环境变量来覆盖此行为。

来自文档:

注意: 一般来说,使用捆绑的魔法数据库(不设置魔法文件和魔法环境变量)是最好的做法,除非您特别需要自定义魔法数据库。

http://php.net/manual/en/function.finfo-open.php

【讨论】:

以上是关于给 PHP 添加 MIME 类型知识的主要内容,如果未能解决你的问题,请参考以下文章

给图片添加水印

PHP Image Uploader - IE "pjpeg" MIME 类型,不工作

PHP 文件的自定义 MIME 类型

如何在IIS添加MIME扩展类型

404.17请添加显式mime

PHP:为啥强制 mime 下载会添加 2 个额外的空行?