Php не возвращает правильный тип mime

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

 <?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/xc -> WHAT ?! echo $files[1]; // text/html -> Ok ! echo $files[2]; // text/x-c++ -> WHAT ?! echo $files[3]; // image/png -> Ok ! ?> 

благодаря

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

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

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

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

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

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

 $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; } 

Проверь это

 <?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 ?> 

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