«Internet Media Types» или «Медиа типы» — является стандартом RFC 6838, который описывает формат файла. Причем браузеры используют MIME-типы в качестве основного критерия, не воспринимая расширения файлов.
MIME-тип состоит из типа и подтипа — двух значений разделённых «/
», без использования пробелов и в нижнем регистре, например HTML страница:
text/html
Полный список MIME типов можно посмотреть тут.
К медиа типу может быть добавлен параметр для указания дополнительных деталей (например кодировка):
text/html; charset=utf-8
При загрузке файла через форму, MIME-тип файла доступен в массиве $_FILES
, например:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Отправить">
</form>
<?php
echo $_FILES['file']['type'];
Для определения MIME уже загруженного файла существует PHP-функция mime_content_type().
echo mime_content_type(__DIR__ . '/image.png'); // image/png
echo mime_content_type(__DIR__ . '/text.txt'); // text/plain
При работе с изображениями, MIME-тип можно получить с помощью функции getimagesize():
Результат:
Array
(
[0] => 221
[1] => 96
[2] => 3
[3] => width="221" height="96"
[bits] => 8
[mime] => image/png
)
Важно помнить что при проверке файлов нельзя полагаться только на проверку MIME, т.к. его значение может быть скомпрометировано. Поэтому нужно проводить более детальную проверку (например по размеру изображения или его пересохранить в предполагаемом формате).
В PHP-скриптах, перед отправкой файлов клиенту, необходимо отправлять заголовок Content-Type
, например файл XML:
Архив ZIP:
$file = ROOT_DIR . '/market.zip';
header('Content-type: application/zip');
header('Content-Transfer-Encoding: Binary');
header('Content-length: ' . filesize($file));
header('Content-disposition: attachment; filename="' . basename($file) . '"');
readfile($file);
exit();
Вывод изображения в зависимости от расширения файла:
$filename = __DIR__ . '/image.png';
$ext = mb_strtolower(mb_substr(mb_strrchr($filename, '.'), 1));
switch ($ext) {
case 'png':
header('Content-type: image/png');
break;
case 'jpg':
case 'jpeg':
header('Content-type: image/jpeg');
break;
case 'gif':
header('Content-type: image/gif');
break;
case 'wepb':
header('Content-type: image/webp');
break;
}
readfile($filename);
exit();