- PHP Headers and Popular Mime Types
- Atom
- CSS
- Javascript
- JPEG Image
- JSON
- RSS
- Text (Plain)
- XML
- Recent Features
- Create Spinning Rays with CSS3: Revisited
- fetch API
- Incredible Demos
- CSS Text Overlap
- CSS pointer-events
- Discussion
- Работа с MIME-типами в PHP
- Как узнать MIME-тип загруженного файла
- Результат:
- Отправка файлов из PHP
- Работа с MIME на PHP
- Определение MIME-типа загруженного файла
- Отправка файла через PHP
- Adding Content-Type Header from PHP
- Examples of Mime-Types
- Character encoding in meta is not necessary
PHP Headers and Popular Mime Types
Like my Create a Basic Web Service Using PHP, MySQL, XML, and JSON illustrates, even though a file’s extension ends in PHP, you can still tell the browser that you’re outputting a different content type. Here are a few of the more popular content types used on the internet.
Atom
header('Content-Type: application/atom+xml');
CSS
header('Content-Type: text/css');
Javascript
header('Content-Type: text/javascript');
JPEG Image
header('Content-Type: image/jpeg');
JSON
header('Content-Type: application/json');
header('Content-Type: application/pdf');
RSS
header('Content-Type: application/rss+xml; charset=ISO-8859-1');
Text (Plain)
header('Content-Type: text/plain');
XML
header('Content-Type: text/xml');
Just because a file ends in .PHP doesn’t mean it responds with XHTML — respond however you’d like!
Recent Features
Create Spinning Rays with CSS3: Revisited
fetch API
Incredible Demos
CSS Text Overlap
CSS pointer-events
Discussion
Great list of mime types.
Perhaps I’d just be careful about the charset at the RSS example. People could add it blindly and suddenly accented characters would stop working if the rest of the site is using other encodings, like utf-8.
Interesting list. Nothing new, but still nice. BTW Javascript and XML should be application, text is obsolete.
Работа с 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();
Работа с MIME на PHP
«Internet Media Types» или «Медиа типы» — является стандартом RFC 6838, показывающий браузеру формат загружаемого файла. Почти все современные браузеры проверяют MIME-тип файла в качестве основного показателя определения расширения файла. MIME-типы используются при создании корпоративных сайтов и разработке сложных интернет-магазинов где нужно загружать или скачивать документы, прайсы, и другие файлы. MIME-тип состоит из двух частей разделённых косой линией «/», в нижнем регистре и без пробелов Также к медиа типу можно добавить дополнительный параметр для указания например кодировки: text/html; charset=utf-8
Определение MIME-типа загруженного файла
Для того чтобы узнать MIME уже загруженного файла в PHP существует функция mime_content_type().
Для получения MIME-типа изображения используется функция getimagesize():
При написании программных модулей по проверке файлов нельзя полагаться только на проверку MIME, т.к. его значение может быть не всегда правильным. Обычно нужно дополнительно проводить еще онду проверку по расширению, размеру изображения, а лучше для максимальной безопасности пересохранить файл в предполагаемом формате.
Отправка файла через PHP
В PHP, перед отправкой файлов через браузер на уровне клиента, необходимо формировать заголовок Content-Type:
Архив ZIP:
Определяем расширение файла изображения и выводим его с соответствующим заголовоком:
Adding Content-Type Header from PHP
How to correctly output different content-types using the PHP header function.
Adding the right Content-Type header is important for PHP applications to function properly. Yet, surprisingly many still do not add the correct character encoding for the type of content they wish to deliver.
In some cases, people even choose to replace certain characters with HTML encoded alternatives, rather than learn how to properly pick and implement an appropriate character encoding.
In todays globalized world, supporting multiple languages from the beginning of new projects is generally a good practice. It can be difficult to tell when you might need to support special characters from other languages, and so, supporting UTF-8 from the start is a good idea.
For example, to support Danish letters (Æ, Ø, and Å, you can use UTF-8 in the Content-Type header field.
header('Content-Type: text/html; charset=utf-8');
To add a content-type, we can use PHP’s header function.
Examples of Mime-Types
The mime-type should be placed before the character encoding. In the above example, we simply use text/html – but there are many others! I included some commonly used ones below:
text/html | For .html pages (Note. Extensions are optional on the web). |
text/plain | Plain text files. If HTML pages are delivered with this, the HTML-source will be shown, without syntax-highlighting. |
image/jpeg | JPEG images. It is possible to output images with PHP as well. |
image/png | PNG images. You can also output PNG images in PHP. |
image/webp | WebP images. Compression is superior to PNG and JPG. |
image/avif | A1/AVIF images. Compression is superior to most other formats, including WebP. |
video/mp4 | Video format. Useful for streaming. |
text/javascript | JavaScript files. Usef for client-sided scripting. |
text/css | CSS files. Used to control the styling of web pages. |
application/pdf | Used to deliver .pdf files. Yes! You may also create .pdf’s in PHP! |
It is important you choose the correct mime-type in order for a browser to know how to display the content. PHP does not just deliver HTML and text pages, it can also show images and video!
Character encoding in meta is not necessary
If you expect users to save your web pages locally, then you should be aware that some systems might not save the file in the correct character encoding. In these cases, you can include a meta element in your HTML, declaring the character encoding of the file:
meta http-equiv="Content-type" content="text/html; charset=utf-8">
If there is a miss-match between the Content-Type declared in your meta element and your HTTP headers, a HTML validator will show a error similar to the below:
The character encoding specified in the HTTP header (iso-8859-1) is different from the value in the element (utf-8).
The solution to this problem is to always make sure both your meta, and HTTP header Content-Type match.
Your CMS should automatically do this for you, but sometimes it may be bugged, or the server might not be configured correctly. Shared hosting solutions can be very bad. It is probably best to host a server on your own, either using a cloud service provider, or on a physical server you own yourself.