我想,这一定是PHP的一个问题,只是不知道
.ai文件无效。我深入研究了finfo,我明白
插入另一个mime定义文件的路径。
这个
fileinfo extension
魔术
我有一个laravel5项目,让我们下载一个用户
(illustrator文件)。问题是,Laravel将.ai文件检测为
应用程序/pdf。
按照上面的解释,找魔法文件检测就可以了
.ai
Adobe Illustrator Artwork
是一个可以保存为EPS或PDF格式的文件。
为了区分普通pdf文件和以pdf格式保存的ai文件,我做了一些研究。首先,我从网上下载了免费的人工智能文件,通过查找来识别文件
magic number
用这两个命令
hexdump
和
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函数或其他一些函数
解决方案在这里。
Adobe Illustrator File
Format Specification
,上面写着:
%%Creator注释标识生成
PostScript语言文档。版本号(中的版本6.0
图1)是任意文本,以换行符结尾。
%%Creator Adobe Illustrator
文件开头应标识为
艾未未先生
让我们写一些
magic rule
$ cat ai
0 string %PDF- PDF document
!:mime application/pdf
>5 byte x \b, version %c
>7 byte x \b.%c
>7 search/1000 %%Creator:\ Adobe\ Illustrator Adobe Illustrator Document
PHP脚本使用自定义的魔术文件
艾未未先生
$ 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
它工作,但我认为这不是一个好主意,保持自己的魔术文件。也许你可以为它写一个简单的函数
艾未未先生
之后
$type = File::mimeType( $_path );
说是pdf文件。