← Усі інструменти

Довідник MIME-типів

Що таке MIME-типи, як працює формат type/subtype, де важливий Content-Type у HTTP та email, поширені типи та чому невірний тип призводить до помилок.
РозширенняMIME-тип

Що таке MIME-тип насправді

MIME-тип, також відомий як медіатип, — це коротка мітка, що повідомляє програмному забезпеченню, який вид даних містить файл або тіло повідомлення. Він з'явився в електронній пошті (назва розшифровується як Multipurpose Internet Mail Extensions — багатоцільові розширення інтернет-пошти), але сьогодні зустрічається повсюди у вебі. Формат завжди виглядає як тип/підтип: широка категорія, скісна риска та конкретний формат. Таким чином, text/html означає «текст у форматі HTML», image/png — «зображення у форматі PNG», а application/json — «прикладні дані, закодовані як JSON».

Верхній рівень типу береться з фіксованого переліку, що підтримується IANA, офіційним реєстром: text, image, audio, video, application, font, model, multipart та кілька новіших, як-от haptics. Підтип — це конкретний формат. Виробники можуть додавати власні з префіксом vnd. (наприклад, application/vnd.ms-excel), а для експериментальних типів історично використовувався префікс x-, хоча ця угода нині не рекомендується.

Абстрактні яскраві іконки форматів файлів, розсортовані за підписаними категоріальними плитками на темно-синьому тлі
Кожен формат файлу відображається на мітку тип/підтип.

Де важливі MIME-типи

Найважливіше місце, де з'являється MIME-тип, — це HTTP-заголовок відповіді Content-Type. Коли сервер надсилає сторінку, зображення або відповідь API, цей заголовок повідомляє браузеру, як інтерпретувати байти. Якщо заголовок містить text/html, браузер відображає розмітку; якщо application/json — виклик fetch() може розібрати відповідь; якщо application/pdf — відкривається вбудований переглядач. Той самий заголовок передається і з боку запиту: коли ви відправляєте форму або тіло запиту API методом POST, Content-Type повідомляє серверу, як читати надіслане.

Крім HTTP, MIME-типи керують кількома іншими системами. Поштові клієнти використовують їх, щоб вирішити, чи є вкладення зображенням для попереднього перегляду, чи двійковим файлом для збереження. Обробники завантажень файлів перевіряють задекларований тип, щоб прийняти або відхилити файли. Операційна система або браузер використовує тип, а не лише розширення файлу, для вибору програми за замовчуванням. Та сама ідея лежить в основі того, як сервери повідомляють результати та помилки разом із HTTP-кодами статусу — відповідь 200 із неправильним типом може бути такою ж зламаною, як і 404.

Ті, що використовуються щодня

Кілька типів охоплюють переважну більшість реального трафіку:

  • text/html — веб-сторінки (розширення .html)
  • text/css — таблиці стилів (.css)
  • text/javascript — рекомендований тип для JavaScript (.js, .mjs)
  • application/json — єдиний офіційний тип JSON, визначений у RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — поширені формати зображень
  • application/pdf — документи PDF (.pdf)
  • application/octet-stream — загальний тип для невідомих або довільних двійкових даних
  • text/plain — стандартний тип для простого тексту без більш конкретного типу

JSON заслуговує окремої примітки, бо тут часто трапляються помилки. Єдиний правильний тип — application/json. Старіший код іноді використовував text/json, text/plain або application/x-javascript, але вони застаріли, й деякі клієнти відмовляться їх розбирати. Параметр charset для JSON також не потрібен — специфікація вимагає UTF-8, тому запис application/json; charset=utf-8 є надлишковим, хоча й нешкідливим. Повнішу таблицю форматів і розширень дивіться в наших довідкових таблицях.

Яскравий пакет даних із позначкою абстрактного типу, що проходить через мережеве з'єднання
Content-Type передається разом із корисним навантаженням через HTTP.

Чому неправильний Content-Type ламає роботу

Браузери та клієнти довіряють задекларованому типу, тому помилка в ньому має конкретні наслідки. Надішліть відповідь JSON API як text/html — і браузер може спробувати відобразити її як розмітку, або суворий клієнт видасть помилку розбору до того, як ваш код взагалі запрацює. Надішліть файл CSS або JavaScript із неправильним типом — і функція безпеки X-Content-Type-Options: nosniff змусить браузер відмовитися від його застосування, мовчки зламавши стилі або скрипти сторінки.

Завантаження файлів — ще одна класична точка відмови. Якщо ви хочете, щоб файл завантажувався, а не відображався, тип має значення нарівні із заголовком Content-Disposition. PDF, надісланий як application/octet-stream, завантажується як звичайний файл замість відкриття у переглядачі; зображення, надіслане як text/plain, відображається як набір нечитабельних символів. З боку завантаження неправильно позначений файл може обійти наївну перевірку розширення — саме тому надійні валідатори перевіряють реальні байти («магічне число»), а не покладаються на тип, вказаний клієнтом.

Історично браузери намагалися вгадати, або «нюхати», справжній тип, якщо заголовок виглядав неправильно. Така поведінка призводила до дірок у безпеці, тому сучасна найкраща практика — завжди надсилати точний Content-Type та вимикати снifфінг за допомогою nosniff. Коротко: навмисно встановлюйте тип для кожної відповіді — і більшість помилок відображення, завантаження та розбору зникнуть самі собою.

Часті запитання

У чому різниця між MIME-типом і медіатипом?

Це одне й те саме. «MIME-тип» — це стара назва з часів електронної пошти, а «медіатип» — термін, якому надають перевагу IANA та сучасні специфікації HTTP. Обидва позначають мітку тип/підтип.

Який правильний MIME-тип для JSON?

Це application/json, визначений у RFC 8259. Застарілі варіанти, як-от text/json або application/x-javascript, більше не актуальні, і деякі клієнти відхилять їх.

Що означає application/octet-stream?

Це загальний тип для довільних двійкових даних без більш конкретної мітки. Сервери використовують його як запасний варіант для невідомих типів файлів, що зазвичай ініціює завантаження замість відображення у браузері.

Чому мій файл CSS або JavaScript не завантажується?

Часто сервер надсилає його з неправильним Content-Type. Якщо встановлено X-Content-Type-Options зі значенням nosniff, браузер відмовляється застосовувати CSS, що не є text/css, або скрипти, що не є типом JavaScript. Виправте конфігурацію сервера, щоб надсилався правильний тип.

Чи можна додати charset до MIME-типу?

Так, для текстових форматів, використовуючи параметр на зразок text/html; charset=utf-8. Для JSON це зайве, оскільки формат завжди є UTF-8 за специфікацією, хоча додавання charset і не шкодить.

Чи визначає розширення файлу MIME-тип?

Не у HTTP. Сервер вирішує, який Content-Type надсилати, і браузер довіряє цьому заголовку. Розширення служить лише підказкою для інструментів та операційних систем, коли явний тип не вказано.