Я подумал, что это проблема с PHP, просто не зная, что такое файл .ai.Я углубился в finfo и понимаю, что определения mime по умолчанию скомпилированы в PHP, но я вижу, что finfo_open имеет второй аргумент 'magic_file', который, как я полагаю, является местом, куда вы можете вставить путь к другому файлу определения mime.
Расширение fileinfo пытается угадать тип mime, ища определенные последовательности magic в определенных позициях в файле.Волшебный файл - это база данных, хранящая столько же, сколько уже известных магических последовательностей.
У меня есть проект Laravel 5, который позволяет пользователю загружать .ai (файлы иллюстраторов).Проблема заключается в том, что Laravel обнаруживает файлы .ai как application / pdf.
Следуйте приведенным выше объяснениям. Это нормально, если вы ищете волшебный файл для обнаружения .ai
файлов в формате pdf.Потому что Adobe Illustrator Artwork - это файл, который можно сохранить в формате EPS или PDF.
Я провел небольшое исследование, чтобы различить общий файл PDF и файл, сохраненный в формате PDF.Прежде всего, я скачал бесплатные файлы ai из Интернета. Определите файлы, посмотрев магическое число с помощью команды 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
Посмотрите на первые несколько байтовфайла, как вы можете видеть, это PDF-файл с расширением .ai
.
После этого я открыл его с помощью Preview на моем Mac. Он знает, что этот файл создан Adobe Illustrator в диалоге инспектора.Так что у него должен быть какой-то способ определить AI-файл, сохраненный в формате PDF.
Большинство тем в Интернете создают пользовательскую функцию PHPили какой-то другой взлом, чтобы обнаружить типы MIME, но я чувствую, что это неправильное решение здесь.
Где я могу найти современные файлы определения MIME и как я могу загрузить их в PHP или Finfo?
Я безуспешно нашел решение, поэтому я создал его сам, На странице 15 из Спецификация формата файла Adobe Illustrator , там написано:
Комментарий %% Creator идентифицирует приложение, сгенерировавшее документ на языке PostScript.Номер версии (версия 6.0 на рисунке 1) - это произвольный текст, оканчивающийся символом новой строки.
Я предполагаю, что файлы, содержащие магические байты pdf и строку %%Creator Adobe Illustrator
в начале файла, должны быть обозначены как .ai
.
Давайте сделаем это, написав несколько магических правил :
$ 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-скрипты используют пользовательские магические файлы для .ai
$ 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
Это работает, но я думаю, что не стоит поддерживать свой собственный магический файл.Может быть, вы можете написать для него простую функцию: Detect .ai
после того, как $type = File::mimeType( $_path );
скажет, что это pdf файл.