Работа с MIME-типами в PHP

«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'];
PHP

Для определения MIME уже загруженного файла существует PHP-функция mime_content_type().

echo mime_content_type(__DIR__ . '/image.png'); // image/png

echo mime_content_type(__DIR__ . '/text.txt');  // text/plain
PHP

При работе с изображениями, MIME-тип можно получить с помощью функции getimagesize():

$filename = __DIR__ . '/image.png';
 
$info = getimagesize($filename);
print_r($info);
PHP

Результат:

Array
(
    [0] => 221
    [1] => 96
    [2] => 3
    [3] => width="221" height="96"
    [bits] => 8
    [mime] => image/png
)

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

В PHP-скриптах, перед отправкой файлов клиенту, необходимо отправлять заголовок Content-Type, например файл XML:

$content = '...';

header("Content-Type: text/xml; charset=utf-8");
echo $content;
exit();
PHP

Архив 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();
PHP

Вывод изображения в зависимости от расширения файла:

$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();
PHP
07.01.2021
2975

Комментарии

, чтобы добавить комментарий.

Другие публикации

Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
45080
+17
Загрузка файлов через AJAX с помощью jQuery Form Plugin
Пример загрузки изображений через AJAX с помощью плагина jQuery Form Plugin.
14123
+3
Загрузка файлов через jQuery AJAX
В преведущей статье был приведен пример отправки файлов через AJAX с помощью плагина «jQuery Form Plugin». Но файлы...
21548
+3
Загрузка изображений с превью AJAX + PHP + MySQL
В данной статье представлена упрощенная реализация загрузки изображений с превью через AJAX с сохранением в базу данных...
10002
+17
Обработка изображений в PHP
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать часть изображения и т.д.
39275
+10
Отправка письма с вложением
Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.
6555
0