Php не возвращает правильный тип пантомимы - PullRequest
7 голосов
/ 08 марта 2011

Функция finfo возвращает сумасшедшие типы пантомимы. Посмотрите следующий код, что происходит?

<?php
    $files = array ("css.css", "index.html", "js.js", "png.png");

    $info = finfo_open (FILEINFO_MIME_TYPE);

    for ($i = 0; $i < count ($files); $i ++) {
        $type = finfo_file ($info, $files[$i]);

        $files[$i] = $type;
    }

    finfo_close ($info);

    echo $files[0]; // text/x-c -> WHAT ?!
    echo $files[1]; // text/html -> Ok !
    echo $files[2]; // text/x-c++ -> WHAT ?!
    echo $files[3]; // image/png -> Ok !
?>

Спасибо

Ответы [ 5 ]

10 голосов
/ 08 марта 2011

Я не очень хорошо знаком с работой fileinfo, но думаю, что это нормально.Текстовые файлы (и это то, что CSS и JS) не дают четких указателей относительно того, какой контент он имеет.У них нет ни байтов заголовка, ни определенной структуры.Таким образом, все, что бедные fileinfo могут сделать, это угадать - как вы можете видеть, с плохими результатами.

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

6 голосов
/ 19 июля 2013

В настоящее время, похоже, есть ошибка с finfo

https://bugs.php.net/bug.php?id=53035

это связано с содержимым базы данных MIME, а не с какой-либо ошибочной логикой.

То, что я делаю (что может быть не так полезно для более сложных ситуаций), - это жесткий код правильных типов пантомимы, которые, как я знаю, мне понадобятся, так что жесткое кодирование просто необходимо будет закомментировать для следующей версии PHP. А-ля:

$info = finfo_open(FILEINFO_MIME_TYPE);     
$mime_type = finfo_file($info, $file_name);
$extension = pathinfo($file_name,PATHINFO_EXTENSION);

//there is a bug with finfo_file();
//https://bugs.php.net/bug.php?id=53035
//
// hard coding the correct mime types for presently needed file extensions
switch($extension){

    case 'css':
        $mime_type = 'text/css';
    break;
    case 'js':
        $mime_type = 'application/javascript';
    default:
    break;
}
2 голосов
/ 08 марта 2011

отметьте это

<?php
$files = array ("css.css", "index.html", "js.js", "png.png");

    for ($i = 0; $i < count ($files); $i ++) {
        $files[$i] = preg_replace("%.*\.(\w)%i", "$1", $files[$i]);
    }

    echo $files[0]; //css
    echo $files[1]; //html
    echo $files[2]; //js
    echo $files[3]; //png
?>
1 голос
/ 31 января 2019

Недавно я столкнулся с ситуацией, когда загруженный текстовый файл был ошибочно распознан как "text / x-c ++" , поскольку он начинался с ключевого слова class .Он был правильно распознан как "text / plain" с другим первым словом.Вероятно, это было связано с алгоритмом распознавания браузера, поскольку это также происходило на этом сайте: https://htmlstrip.com/mime-file-type-checker

0 голосов
/ 08 марта 2011

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

...