Php 7.2 волшебный файл Finfo

У меня есть проект 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. .

Я пробовал использовать файл 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 в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
2 095
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I figured, this has to be an issue with PHP simply not knowing what an .ai file is. I dug deeper into finfo and I understand that the default mime definitions are compiled into PHP, but I see that finfo_open, has a second argument 'magic_file', which I assume is a place that you can insert the path to a different mime definition file.

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

I have a Laravel 5 project, which let's an user download .ai (illustrator files). The issue is that Laravel detects .ai files as application/pdf.

Следуйте приведенному выше объяснению, это нормально для поиска волшебного файла для обнаружения файлов .ai как pdf. Поскольку Работа Adobe Illustrator - это файл, который можно сохранить в формате EPS или PDF.

Я провел небольшое исследование, чтобы различить общий файл pdf и файл ai, сохраненный в формате 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.

После этого я открыл его с помощью предварительного просмотра на моем Mac, он знает, что этот файл создан Adobe Illustrator в диалоговом окне Inspector. Так что у него должен быть какой-то способ выяснить AI-файл, сохраненный в формате PDF.

Inspector Dialog

Most of the topics online create a custom PHP function or some other hack to detect mime types, but I feel as if that is not the correct solution here.

Where can I find up-to-date mime definition files and how can I load them into PHP or finfo?

Мне не повезло найти решение в Google, поэтому я создал его сам. На странице 15 Файл Adobe Illustrator Спецификация формата говорится:

The %%Creator comment identifies the application that generated the PostScript language document. The version number (version 6.0 in Figure 1) is arbitrary text, terminated by a newline character.

Я предполагаю, что файлы, содержащие магические байты 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».

Другие вопросы по теме