exif_imagetype
exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.
exif_imagetype() может использоваться, чтобы избежать вызовов других exif-функций с неподдерживаемыми аргументами. Также при взаимодействии с $_SERVER[‘HTTP_ACCEPT’] можно проверять, будет ли изображение отображаться в браузере.
Список параметров
filename Изображение, тип которого требуется определить.
Возвращаемые значения
Если корректная сигнатура обнаружена, функция вернёт соответствующую типу изображения константу. В противном случае функция вернёт false . Возвращаемое значение то же, что и во втором аргументе при возврате из функции getimagesize() , однако exif_imagetype() значительно быстрее.
Следующие определённые константы представляют возможные возвращаемые значения функции exif_imagetype() :
Значение | Константа |
---|---|
1 | IMAGETYPE_GIF |
2 | IMAGETYPE_JPEG |
3 | IMAGETYPE_PNG |
4 | IMAGETYPE_SWF |
5 | IMAGETYPE_PSD |
6 | IMAGETYPE_BMP |
7 | IMAGETYPE_TIFF_II (порядок байт intel) |
8 | IMAGETYPE_TIFF_MM (порядок байт motorola) |
9 | IMAGETYPE_JPC |
10 | IMAGETYPE_JP2 |
11 | IMAGETYPE_JPX |
12 | IMAGETYPE_JB2 |
13 | IMAGETYPE_SWC |
14 | IMAGETYPE_IFF |
15 | IMAGETYPE_WBMP |
16 | IMAGETYPE_XBM |
17 | IMAGETYPE_ICO |
18 | IMAGETYPE_WEBP |
Замечание:
В случаях, когда невозможно считать количество байтов из файла достаточное для определения типа изображения, функция exif_imagetype() вызовет предупреждение уровня E_NOTICE и вернёт false .
Список изменений
Версия | Описание |
---|---|
7.1.0 | Добавлена поддержка WebP. |
The .jpg and .jpeg Mime Type
Tutorial on delivering jpeg files with the correct mime type and headers using PHP.
The correct content-type to use for delivering jpeg image files over the HTTP protocol is image/jpeg. The standard file extension for jpeg images is .jpeg, but .jpg is also broadly supported.
A HTTP response to deliver a jpeg image can look like this:
HTTP/1.1 200 OK content-type: image/jpeg content-length: 39354
Note. A character-set is not needed for image files.
To use the image/jpeg Mime Type from a PHP script, use the header function:
header('content-type: image/jpeg'); // Body output after this point
Deliver JPEG files from PHP
Reading a local file into a variable can be done using file_get_contents, but this is impractical for larger files. After reading the content of a file, you can output it with echo.
While this below example works, there are many potential issues depending on the circumstances, so you should not use this without taking additional steps:
// Path to file $file_path = '/var/www/test.jpeg'; // Obtain file size for the content-length header $file_size = filesize($file_path); // Read the content from the file $jpeg_file = file_get_contents($file_path); header('content-length: ' . $file_size); header('content-type: image/jpeg'); echo $jpeg_file;
JPEG vs JPG
The .jpg and .jpeg are both jpeg image files. The original extension used was .jpeg, but early Windows versions used .jpg, and many now prefer the 3 letter file extension as a result.
Browsers will accept the image/jpeg Mime Type for both file types. The image/jpg Mime Type does not exist.
Instead of using jpeg images, you may want to consider using the new webp format, as it offers better compression.
Editing JPEG files
You can edit .jpeg files using an editor such as Gimp or Paint.NET.
Gimp works well in both Windows and Linux, check gimp.org for the latest version.
Paint.NET works best in Windows, find it here: getpaint.net.
Работа с MIME-типами в PHP
«Internet Media Types» или «Медиа типы» — является стандартом RFC 6838, который описывает формат файла. Причем браузеры используют MIME-типы в качестве основного критерия, не воспринимая расширения файлов.
MIME-тип состоит из типа и подтипа — двух значений разделённых « / », без использования пробелов и в нижнем регистре, например HTML страница:
Полный список MIME типов можно посмотреть тут.
К медиа типу может быть добавлен параметр для указания дополнительных деталей (например кодировка):
Как узнать MIME-тип загруженного файла
При загрузке файла через форму, MIME-тип файла доступен в массиве $_FILES , например:
Для определения 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():
$filename = __DIR__ . '/image.png'; $info = getimagesize($filename); print_r($info);
Результат:
Array ( [0] => 221 [1] => 96 [2] => 3 [3] => width="221" height="96" [bits] => 8 [mime] => image/png )
Важно помнить что при проверке файлов нельзя полагаться только на проверку MIME, т.к. его значение может быть скомпрометировано. Поэтому нужно проводить более детальную проверку (например по размеру изображения или его пересохранить в предполагаемом формате).
Отправка файлов из PHP
В PHP-скриптах, перед отправкой файлов клиенту, необходимо отправлять заголовок Content-Type , например файл XML:
$content = '. '; header("Content-Type: text/xml; charset=utf-8"); echo $content; exit();
$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();