Как узнать MIME-тип файла с помощью PHP?
У меня есть файл index.php, который должен обрабатывать различные типы файлов. Как я могу определить тип файла на основе REQUEST_URI
?
Если я запрашиваю http://site/image.jpg
, и все запросы перенаправляются через index.php, который выглядит следующим образом:
<?php
include('/www/site'.$_SERVER['REQUEST_URI']);
?>
Как сделать так, чтобы это работало правильно?
Мне стоит проверять расширение запрашиваемого файла или есть другой способ получить его тип?
5 ответ(ов)
Функция mime_content_type()
устарела, поэтому не стоит полагаться на её работу в будущем. Существует расширение PECL "fileinfo", но о нем ходят не самые лучшие отзывы.
Если вы используете сервер на Unix-подобной системе, вы можете воспользоваться следующим решением, которое хорошо работает для меня:
$file = escapeshellarg($filename);
$mime = shell_exec("file -bi " . $file);
При этом вы, вероятно, захотите использовать абсолютный путь к файлу в переменной $filename
.
Вы можете использовать следующий способ для определения MIME-типа файла, если у вас нет доступа к finfo
, mime_content_type
и shell_exec
. Вместо этого попробуйте использовать расширение getimagesize()
для изображений или выполнять проверку по расширению файла. Вот пример решения:
function get_mime($file) {
$mime_types = array(
"jpg" => "image/jpeg",
"jpeg" => "image/jpeg",
"png" => "image/png",
"gif" => "image/gif",
"txt" => "text/plain",
"pdf" => "application/pdf",
// добавьте другие типы по мере необходимости
);
$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
return isset($mime_types[$extension]) ? $mime_types[$extension] : "application/octet-stream"; // Возвращает по умолчанию для неизвестного типа
}
Этот код будет работать в условиях, когда у вас нет доступа к стандартным функциям для определения MIME-типа. Он просто использует массив для сопоставления расширений файлов с их MIME-типами. Обратите внимание, что для различных типов файлов вам может потребоваться добавить больше расширений и соответствующих MIME-типов.
Если вы работаете только с изображениями и вам нужен MIME-тип (например, для заголовков), то вот самый быстрый и прямой ответ:
$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));
Этот код вернёт правильный MIME-тип изображения, даже если вы измените имя файла.
Функция mime_content_type()
действительно может быть полезной, несмотря на ранее упомянутые комментарии о ее устаревании. На самом деле она не устарела — по крайней мере, эта версия mime_content_type()
не считается устаревшей, согласно документации PHP на http://php.net/manual/en/function.mime-content-type.php. Эта функция является частью расширения FileInfo, и, как указывается в документации PHP, она включена по умолчанию, начиная с PHP 5.3.0.
Если вы используете Linux и у вас есть доступ к расширению, вы можете просто прочитать MIME-типы из файла /etc/mime.types
, создав хеш-таблицу. Затем вы можете сохранить эту информацию в памяти и получать MIME-тип по ключу из массива 😃
Вот пример функции, которая извлекает все MIME-типы из стандартного файла /etc/mime.types
на Linux:
/**
* Вспомогательная функция для извлечения всех mime-типов из стандартного файла /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]; // Сохранение расширения и соответствующего MIME-типа
}
}
}
fclose($fh);
}
return $mime_types; // Возвращаем ассоциативный массив с расширениями и MIME-типами
}
Эта функция проверяет наличие файла /etc/mime.types
, открывает его для чтения и извлекает MIME-типы, сопоставляя их с их расширениями. Вы можете использовать полученный ассоциативный массив для быстрого доступа к MIME-типам по расширениям файлов.
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?
Как читать большой файл построчно?
ReCaptcha 2.0 с использованием AJAX
Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?