PHP7.2Finfo魔术文件

PHP7.2Finfo魔术文件,php,mime-types,libmagic,Php,Mime Types,Libmagic,我有一个Laravel5项目,让用户下载.ai(illustrator文件)。问题是Laravel将.ai文件检测为application/pdf 我正在使用此函数检测mime类型 $type = File::mimeType( $_path ); 我也尝试过使用这种方法,但得到了相同的结果 $finfo = finfo_open(FILEINFO_MIME); $mimetype = $finfo->file($_path); finfo_close($finfo); 我想,这一定是

我有一个Laravel5项目,让用户下载.ai(illustrator文件)。问题是Laravel将.ai文件检测为application/pdf

我正在使用此函数检测mime类型

$type = File::mimeType( $_path );
我也尝试过使用这种方法,但得到了相同的结果

$finfo = finfo_open(FILEINFO_MIME);
$mimetype = $finfo->file($_path);
finfo_close($finfo);
我想,这一定是PHP的一个问题,只是不知道.ai文件是什么。我深入研究了finfo,我知道默认的mime定义是编译成PHP的,但我看到finfo_open有第二个参数“magic_file”,我假设这是一个可以插入不同mime定义文件路径的地方

我尝试使用Ubuntu的/etc/magic.mime文件,但finfo给了我

ErrorException: finfo_open(): Warning: offset `application\/activemessage' invalid in
错误。我认为这是因为magic.mime文件的格式不正确

大多数在线主题都会创建一个自定义PHP函数或其他一些黑客来检测mime类型,但我觉得这似乎不是正确的解决方案

在哪里可以找到最新的mime定义文件,如何将它们加载到PHP或finfo中

我的环境:

Ubuntu 16.04
PHP 7.2
我想,这一定是PHP的一个问题,根本不知道 .ai文件是。我深入研究了finfo,我知道默认 mime定义被编译成PHP,但我看到finfo_open 第二个参数是“magic_file”,我假设它是一个可以 插入其他mime定义文件的路径

通过在文件中的特定位置查找某些魔术序列,可以尝试猜测mime类型。magic文件是一个数据库,它存储了已知的magic序列

我有一个Laravel5项目,让我们下载一个用户 (illustrator文件)。问题是Laravel将.ai文件检测为 申请表/pdf

按照上面的解释,可以通过查找magic文件来检测pdf格式的
.ai
文件。因为是一个可以保存为EPS或PDF格式的文件

为了区分普通pdf文件和以pdf格式保存的ai文件,我做了一些研究。首先,我从互联网上下载了免费的ai文件,通过使用命令
hextump
file
来识别文件

$ hexdump -C 7_full_ai_vi_template_vector_8.ai | head
00000000  25 50 44 46 2d 31 2e 34  0d 25 e2 e3 cf d3 0d 0a  |%PDF-1.4.%......|
00000010  31 20 30 20 6f 62 6a 0d  3c 3c 20 0d 2f 54 79 70  |1 0 obj.<< ./Typ|
00000020  65 20 2f 43 61 74 61 6c  6f 67 20 0d 2f 50 61 67  |e /Catalog ./Pag|
00000030  65 73 20 32 20 30 20 52  20 0d 2f 4d 65 74 61 64  |es 2 0 R ./Metad|
00000040  61 74 61 20 38 38 20 30  20 52 20 0d 3e 3e 20 0d  |ata 88 0 R .>> .|
00000050  65 6e 64 6f 62 6a 0d 32  20 30 20 6f 62 6a 0d 3c  |endobj.2 0 obj.<|
00000060  3c 20 0d 2f 54 79 70 65  20 2f 50 61 67 65 73 20  |< ./Type /Pages |
00000070  0d 2f 4b 69 64 73 20 5b  20 35 20 30 20 52 20 5d  |./Kids [ 5 0 R ]|
00000080  20 0d 2f 43 6f 75 6e 74  20 31 20 0d 3e 3e 20 0d  | ./Count 1 .>> .|
00000090  65 6e 64 6f 62 6a 0d 33  20 30 20 6f 62 6a 0d 3c  |endobj.3 0 obj.<|
$ file 7_full_ai_vi_template_vector_8.ai
7_full_ai_vi_template_vector_8.ai: PDF document, version 1.4
PHP脚本对
.ai

$ cat fileinfo.php
<?php

$magic_file = __DIR__ . '/ai';

$finfo = new finfo(FILEINFO_NONE, $magic_file);
echo $finfo->file($argv[1]) . PHP_EOL;
这是可行的,但我认为维护自己的魔法文件不是个好主意。也许您可以为它编写简单的函数,在
$type=File::mimeType($\u路径)之后检测
.ai
表示它是pdf文件

$ cat fileinfo.php
<?php

$magic_file = __DIR__ . '/ai';

$finfo = new finfo(FILEINFO_NONE, $magic_file);
echo $finfo->file($argv[1]) . PHP_EOL;
$ php fileinfo.php ./7_full_ai_vi_template_vector_8.ai
PDF document, version 1.4 Adobe Illustrator Document