Finfo_file возвращает неверный тип - PullRequest
0 голосов
/ 13 января 2019

Добрый день!

Мой код возвращает неправильный тип для этого файла PDF. Для другого файла PDF этот код хорош.

    $finfo = @finfo_open(FILEINFO_MIME);
    $mime = @finfo_file($finfo, 'upload/123.pdf');
    finfo_close($finfo);

    print_r($mime);

Это ответ: Применение / октет-поток; кодировка = двоичный

Это то, что мне нужно: применение / PDF

Это файл PDF https://dropmefiles.com/x6slw

Спасибо!

1 Ответ

0 голосов
/ 13 января 2019

Ну, мне было любопытно, я скачал твой файл и да, при запуске твоего кода это не дало мне application/pdf, а вместо этого application/octet-stream; charset=binary

Поскольку функция finfo использует сигнатуру файла (в байтах) для определения типа файла MIME, я сделал предположение - что-то должно быть не так с сигнатурой, поэтому я проанализировал ее в программе Hex-viewer, и это то, что я нашел

Ваш файл enter image description here

Обычный файл enter image description here

Для правильной идентификации подпись PDF должна присутствовать в самом начале, но в вашем файле она была смещена на 4 байта. Поскольку finfo не смог найти правильный тип MIME, он вернулся к своему универсальному "application / octet-stream; charset = binary"

Так как исправить?

Я должен признать, что встроенные функции php довольно хороши для обычных задач, но иногда здесь и там вы можете столкнуться с тем «крайним случаем», в который входят сторонние библиотеки с открытым исходным кодом, и здесь я обнаружил, что это можно исправить для вас.

PhpMimeType : https://github.com/katzien/PhpMimeType

$type = \MimeType\MimeType::getType('123.pdf');
print_r($type); //"application/pdf"
                // Yay!
...