MIME-типы — php 7.2 finfo magic file

У меня есть проект Laravel 5, который позволяет пользователю загружать .ai (файлы иллюстраторов). Проблема в том, что Laravel обнаруживает файлы .ai как application / pdf.

Я обнаруживаю пантомиму с помощью этой функции

$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 ,

Я попытался использовать файл /etc/magic.mime в Ubuntu, но finfo дал мне

ErrorException: finfo_open(): Warning: offset `application\/activemessage' invalid in

ошибка. Я предполагаю, что файл magic.mime имеет неправильный формат.

Большинство тем в Интернете создают пользовательскую функцию PHP или какой-то другой хак для обнаружения типов пантомимы, но я чувствую, что это не является правильным решением здесь.

Где я могу найти современные файлы определения mime и как я могу загрузить их в PHP или finfo?

Моя среда:

Ubuntu 16.04
PHP 7.2

2

Решение

Я решил, что это должно быть проблемой с PHP, просто не зная, что
.ai файл есть. Я копнул глубже в finfo, и я понимаю, что по умолчанию
определения MIME скомпилированы в PHP, но я вижу, что finfo_open имеет
второй аргумент ‘magic_file’, который, как я полагаю, является местом, где вы можете
вставьте путь к другому файлу определения MIME.

расширение файла попробуйте угадать тип пантомимы, ища наверняка магия последовательности в определенных местах в файле. Волшебный файл — это база данных, хранящаяся столько, сколько уже известны магические последовательности.

У меня есть проект Laravel 5, который позволяет пользователю скачать .ai
(файлы иллюстраторов). Проблема в том, что Laravel обнаруживает файлы .ai как
применение / 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 и как я могу загрузить
их в 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

Это работает, но я думаю, что не стоит поддерживать свой собственный магический файл. Может быть, вы можете написать простую функцию для этого, обнаружить .ai после $type = File::mimeType( $_path ); говорит, что это PDF-файл.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]