Итак, у меня есть файл 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');