Intereting Posts
PHP: можно ли переходить из одного случая в другой внутри коммутатора? Неопределенная ошибка индекса при отправке переменной из jquery в php Как удалить элементы с одним и тем же ключом префикса в memcached с помощью расширения PHP memcache? JSON кодирует несколько строк MySQL Неустранимая ошибка: нельзя использовать isset () в результате выражения Сравните два изображения с ImageMagick Как удалить последний символ в тексте? Запустить PHP-код внутри JavaScript? Будет ли это нормально использовать? Получить первый ключ в (возможно) ассоциативном массиве? генерировать 10 цифр буквенно-цифровое значение в php с первой, третьей, четвертой цифрой должно быть алфавитом Создайте индикатор выполнения при вызове $ .ajax В чем разница между is_null ($ var) и ($ var === null)? Каков правильный способ настройки и использования php-resque? Файлы для загрузки Codeigniter Force Массив и foreach

Как найти mime-тип файла с php?

Итак, у меня есть файл index.php, который обрабатывает много разных типов файлов. как я могу определить тип файла на основе REQUEST_URI .

Если я http://img.ruphp.com/php/image.jpg , и все запросы перенаправят через index.php, который выглядит следующим образом:

 <?php include('/www/site'.$_SERVER['REQUEST_URI']); ?> 

Как я могу сделать эту работу правильно?

Должен ли я тестировать на основе расширения запрошенного файла или есть способ получить файл?

Если вы уверены, что работаете только с изображениями, вы можете проверить getimagesize () exif_imagetype () PHP-функция, которая пытается вернуть образ mime-типа.

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

Наконец, вы можете проверить функцию mime_content_type (), но она устарела для расширения Fileinfo PECL.

mime_content_type () устарел, поэтому вы не сможете рассчитывать на то, что он будет работать в будущем. Существует расширение «fileinfo» PECL, но я ничего не слышал об этом.

Если вы работаете на сервере * nix, вы можете сделать следующее, что отлично сработало для меня:

 $file = escapeshellarg( $filename ); $mime = shell_exec("file -bi " . $file); $filename should probably include the absolute path. 
 function get_mime($file) { if (function_exists("finfo_file")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension $mime = finfo_file($finfo, $file); finfo_close($finfo); return $mime; } else if (function_exists("mime_content_type")) { return mime_content_type($file); } else if (!stristr(ini_get("disable_functions"), "shell_exec")) { // http://stackoverflow.com/a/134930/1593459 $file = escapeshellarg($file); $mime = shell_exec("file -bi " . $file); return $mime; } else { return false; } } 

Для меня ничего из этого не работает – mime_content_type устарел, finfo не установлен, а shell_exec не разрешен.

Мне на самом деле надоело из-за отсутствия стандартных методов нюхания MIME в PHP. Установите fileinfo … Используйте устаревшие функции … О, эти работы, но только для изображений! Я устал от этого, поэтому я провел некоторое исследование и нашел спецификацию WHATWG Mimesniffing – я считаю, что это все еще особенность проекта.

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

Вот класс MimeReader .

 require_once("MimeReader.php"); $mime = new MimeReader(<YOUR FILE PATH>); $mime_type_string = $mime->getType(); // "image/jpeg" etc. 

Если вы работаете только с изображениями и вам нужен тип mime (например, для заголовков), то это самый быстрый и самый прямой ответ:

 $file = 'path/to/image.jpg'; $image_mime = image_type_to_mime_type(exif_imagetype($file)); 

Он выдаст true mime-тип изображения, даже если вы переименуете свой файл изображения

Согласно руководству php, функция finfo-файла – лучший способ сделать это. Однако вам нужно будет установить расширение FileInfo PECL.

Если расширение не является опцией, вы можете использовать устаревшую функцию mime_content_type .

mime_content_type() – это путь, несмотря на приведенные выше комментарии, в которых говорится, что он устарел. Это не так – или, по крайней мере, это воплощение mime_content_type() не устарело, согласно http://php.net/manual/en/function.mime-content-type.php . Он является частью расширения FileInfo, но в документации по PHP теперь указывается, что он включен по умолчанию с PHP 5.3.0.

Вы можете использовать finfo для выполнения этого с PHP 5.3:

 <?php $info = new finfo(FILEINFO_MIME_TYPE); echo $info->file('myImage.jpg'); // prints "image/jpeg" 

Флаг FILEINFO_MIME_TYPE не является обязательным; без него вы получите более подробную строку для некоторых файлов; (видимо, некоторые типы изображений возвращают информацию о размере и глубине цвета). Использование флага FILEINFO_MIME возвращает тип mime и кодировку, если они доступны (например, image / png; charset = двоичный или text / x-php; charset = us-ascii). См. Этот сайт для получения дополнительной информации.

Я не использовал его, но есть расширение PECL для получения файла mimetype. Официальная документация для него приведена в руководстве .

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

я получил очень хорошие результаты, используя функцию пользователя из http://php.net/manual/de/function.mime-content-type.php @ '' john dot howard at prismmg dot com 26-Oct-2009 03:43 ' '

 function get_mime_type($filename, $mimePath = '../etc') { ... 

который не использует функцию finfo, exec или устаревшую функцию

хорошо работает и с удаленными ресурсами!

если вы имеете дело только с изображениями, вы можете использовать [getimagesize()][1] которая содержит все виды информации об изображении, включая тип.

Более общий подход заключается в использовании расширения FileInfo из PECL. Документацию PHP для этого расширения можно найти по адресу: http://us.php.net/manual/en/ref.fileinfo.php

У некоторых людей есть серьезные жалобы на это расширение … поэтому, если у вас возникают серьезные проблемы или вы не можете установить расширение по какой-либо причине, вы можете проверить устаревшую функцию mime_content_type()

Если вы запускаете Linux и имеете расширение, вы можете просто прочитать MIME-тип из /etc/mime.types, создав хэш-массив. Затем вы можете сохранить это в памяти и просто вызвать MIME с помощью массива.

 /** * Helper function to extract all mime types from the default Linux /etc/mime.types */ function get_mime_types() { $mime_types = array(); if ( file_exists('/etc/mime.types') && ($fh = fopen('/etc/mime.types', 'r')) !== false ) { while (($line = fgets($fh)) !== false) { if (!trim($line) || substr($line, 0, 1) === '#') continue; $mime_type = preg_split('/\t+/', rtrim($line)); if ( is_array($mime_type) && isset($mime_type[0]) && $mime_type[0] && isset($mime_type[1]) && $mime_type[1] ) { foreach (explode(' ', $mime_type[1]) as $ext) { $mime_types[$ext] = $mime_type[0]; } } } fclose($fh); } return $mime_types; } 

Мим любого файла на вашем сервере можно получить с помощью этого

 <?php function get_mime($file_path){ $finfo = new finfo(FILEINFO_MIME_TYPE); $type = $finfo->file(file_path); } $mime = get_mime('path/to/file.ext');