我知道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内置和file
以某种方式使用相同的数据库。如何训练PHP以了解AMR文件的MIME类型?
PHP似乎使用自己的捆绑数据库进行文件信息查找;您可以通过将第二个参数添加到new finfo
调用或通过设置MAGIC
env var来覆盖此行为。
来自文档:
注意:通常,使用捆绑的魔术数据库(通过保留magic_file和MAGIC环境变量未设置)是最佳操作,除非您特别需要自定义魔术数据库。