Типи MIME

A Multipurpose Internet Mail Extensions (MIME) type - тип багатоцільових розширень Інтернет-пошти - це стандарт, що вказує на характер і формат документа, файлу або набору байт. Означений і стандартизований в IETF RFC 6838.

Internet Assigned Numbers Authority (IANA)  відповідає за всі офіційні типи MIME, і Ви можете знайти найновіший і повний список на сторінці Media Types.

Браузери використовують тип MIME, а не розширення файлу, для означення того, як потрібно обробляти URL.  Тому дуже важливо, щоб сервери надсилали правильний тип MIME у заголовку відповіді Content-Type.

Синтаксис

Загальна структура

type/subtype

Тип MIME складається з типу і підтипу - двох рядків, розділених /. Пробіли не дозволяються. Тип представляє категорію і може бути дискретним(discrete) або багаточастинним (multipart ). Підтип специфічний для кожного типу.

Типи MIME нечутливі до регістру, але традиційно написані малими літерами.

Дискретні (Discrete) типи

text/plain
text/html
text/javascript
text/css
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/ecmascript
application/octet-stream
…

Дискретні типи позначають категорію документа. Вони можуть бути одним з наступних:

Тип Опис Приклад типових підтипів
text Будь-який документ, що містить текст і теоретично читається людиною text/plain, text/html, text/css, text/javascript, text/markdown
image Будь-яке зображення. Відео сюди не включено, хоча анімовані зображення (наприклад, анімовані GIF) описуються також типом image. image/gif, image/png, image/jpeg, image/bmp, image/webp, image/vnd.microsoft.icon
audio Будь-який аудіофайл audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video Будь-який відеофайл video/webm, video/ogg
application Будь-які двійкові дані, особливо дані, які будуть виконані або якось інтерпретовані. application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

Для текстових документів без особливого підтипу слід використовувати text/plain.

Аналогічно, для двійкових документів без певного або відомого підтипу слід використовувати application/octet-stream.

Багаточастинні типи

multipart/form-data
multipart/byteranges

Багаточастинні (Multipart) типи позначають категорію документа, розбиту на частини, часто з різними типами MIME. Вони є складеними з частин документами. За винятком multipart/form-data, що використовуються в методі POST HTML-форм і multipart/byteranges, що використовуються для надсилання документа з 206 Partial Content, HTTP не обробляє багаточастинні документи спеціальним чином: повідомлення передається в браузер (який, ймовірно, покаже вікно "Зберегти як", якщо він не знає, як відобразити документ.)

Важливі для веб-розробників типи MIME

application/octet-stream

Типово, це бінарні файли. Оскільки це значить невідомий двійковий файл (unknown binary file), браузери зазвичай не виконують його, або запитують, чи він повинен бути виконаний. Вони розглядають його, аналогічно заголовку Content-Disposition який встановлений в значення attachment, і пропонують діалогове вікно "Зберегти як".

text/plain

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

Зверніть увагу, що text/plain не те саме що "один з текстових типів даних". Якщо браузер очікує конкретний тип текстових даних, то ймовірно, не вважатиме його відповідним до цього типу. Зокрема, якщо браузер завантажує text/plain файл з елемента <link>, який оголошує файли CSS, то не буде розпізнавати його як дійсні файли CSS, якщо ті будуть представлені як text/plain. Їх необхідно об'являти як MIME тип text/css.

text/css

Файли CSS, які використовуються для оформлення веб-сторінки, повинні бути надіслані з типом text/css. Якщо сервер не розпізнає суфікс .css для файлів CSS, він може надіслати їх за допомогою MIME типів text/plain або application/octet-stream. У ньому випадку більшість браузерів їх не розпізнають як CSS і будуть ігнорувати.

text/html

Весь HTML-вміст повинен подаватися з цим типом. На сьогодні, альтернативні типи MIME для XHTML (типу application/xhtml+xml) в основному безкорисні.

Note: Примітка. Використовуйте типи application/xml або application/xhtml+xml, якщо ви хочете, щоб правила XML-парсингу були жорсткі, до розділів <![CDATA[…]]> та елементів не з HTML/SVG/MathML.

text/javascript

У розділі Мов сценаріїв у стандарті HTML зазначено:

Сервери повинні використовувати text/javascript для ресурсів JavaScript. Сервери не повинні використовувати інші типи JavaScript MIME для ресурсів JavaScript і не повинні використовувати типи MIME, які не належать до JavaScript.

Інші типи MIME JavaScript, які не слід використовувати, визначені в MIME Sniffing Standard наступним чином:

  • application/javascript
  • application/ecmascript
  • application/x-ecmascript
  • application/x-javascript
  • text/ecmascript
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/jscript
  • text/livescript
  • text/x-ecmascript
  • text/x-javascript

Типи для зображень

Лише декілька типів зображень є загальновизнаними, щоб бути безпечними для використання на веб-сторінці:

Тип MIME Тип зображення
image/gif зображення GIF (стискання без втрат, замінений на PNG)
image/jpeg зображення JPEG
image/png зображення PNG
image/svg+xml зображення SVG (векторні зображення)
image/x-icon, image/vnd.microsoft.icon[1] піктограми Windows

Існує дискусія щодо додавання до цього списку WebP (image/webp), але виробники веб-браузерів обережно приймають його.

У веб-документах можна знайти інші види зображень. Наприклад, багато веб-браузерів підтримують зображення ICO для favicons, використовуючи MIME-тип image/x-icon  .

Примітка 1
Незважаючи на те, що image/vnd.microsoft.icon зареєстровано в IANA, воно в основному не підтримується, а використовується image/x-icon .

Аудіо- та відео-типи

Як і зображення, HTML не означує підтримувані типи для елементів <audio> і <video> , тому лише деякі з них можуть використовуватися в Веб. Формати мультимедіа, що підтримуються аудіо- та відео-елементами HTML вказують як на застосовані кодеки, так і на контейнери, які можна для них використовувати.

Тип аудіовізуальних файлів MIME в основному вказує на формати контейнерів. Найбільш поширеними для Веб є:

тип MIME тип Аудіо або відео
audio/wave
audio/wav
audio/x-wav
audio/x-pn-wav
Аудіофайл у форматі контейнера WAVE. Часто підтримується аудіокодек PCM (кодек WAVE "1"), інші кодеки мають обмежену підтримку (якщо є).
audio/webm Аудіофайл у форматі контейнера WebM. Найпоширенішими аудіокодеками є Vorbis і Opus.
video/webm Відеофайл, можливо з аудіо, у форматі контейнера WebM. VP8 і VP9 є найпоширенішими відеокодеками; Vorbis і Opus найбільш поширені аудіокодеки.
audio/ogg Аудіофайл у форматі контейнера OGG. Vorbis є найпоширенішим аудіокодеком, який використовується в такому контейнері.
video/ogg Відеофайл, можливо, зі звуком, у форматі контейнера OGG. Зазвичай використовується в ньому відеокодек Theora, аудіокодек - Vorbis.
application/ogg Аудіо- або відеофайл у форматі контейнера OGG. Зазвичай використовується в ньому відеокодек Theora, аудіокодек - Vorbis.

multipart/form-data

Тип multipart/form-data можна використовувати при відправленні з браузера на сервер значень завершеної форми HTML .

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

Content-Type: multipart/form-data; boundary=aBoundaryString
(інші заголовки асоційовані з багаточастинним документом як цілим)

--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg

(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"

(data)
--aBoundaryString
(more subparts)
--aBoundaryString--

Наступна <form>:

<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
  <label>Name: <input name="myTextField" value="Test"></label>
  <label><input type="checkbox" name="myCheckBox"> Check</label>
  <label>Upload file: <input type="file" name="myFile" value="test.txt"></label>
  <button>Send the file</button>
</form>

надішле таке повідомлення:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465

-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"

Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"

on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain

Simple file.
-----------------------------8721656041911415653955004498--

multipart/byteranges

MIME тип multipart/byteranges використовується для відправлення часткових відповідей браузеру.

Коли відправлено код статусу 206 Partial Content, цей тип MIME вказує, що документ складається з декількох частин, по одному для кожного із запитаних діапазонів. Як і інші типи багаточастинних файлів, Content-Type використовує межу (boundary) для розділення фрагментів. Кожен фрагмент має заголовок Content-Type з його фактичним типом і діапазону Content-Range, який він представляє.

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385

--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270

-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--

Важливість встановлення правильного типу MIME

Більшість веб-серверів надсилають нерозпізнані ресурси як MIME-тип application/octet-stream. З міркувань безпеки більшість браузерів не дозволяють встановлювати типові користувацькі дії для таких ресурсів, змушуючи користувача зберігати його на диску для подальшого використання.

Деякі поширені неправильні конфігурації сервера:

  • RAR-стислі файли. У цьому випадку ідеальним буде справжній тип вихідних файлів; це часто неможливо, оскільки файли .RAR можуть містити кілька ресурсів різних типів. У цьому випадку налаштуйте сервер для надсилання application/x-rar-compressed.

  • Аудіо та відео. У елементах <video> або <audio> будуть відтворюватися лише ресурси з правильним типом MIME. Обов'язково використовуйте правильний тип для аудіо та відео.

  • Власні типи файлів. Уникайте використання application/octet-stream, оскільки більшість браузерів не дозволяють визначити для цього загального типу MIME типову для них поведінку (наприклад, "Відкрити в Word") . Конкретний тип, як application/vnd.mspowerpoint, дозволяє користувачам автоматично відкривати такі файли у своєму виборі.

Авто-розпізнавання MIME (sniffing)

За відсутності типу MIME, або в деяких випадках, коли браузери вважають, що вони неправильні, вони можуть виконувати авто-розпізнавання (MIME sniffing) - вгадуючи правильний тип MIME, переглядаючи байти ресурсу.

Кожен браузер виконує авто-розпізнавання MIME по-різному і за різних обставин. (Наприклад, Safari розглядатиме розширення файлу в URL-адресі, якщо відправлений тип MIME непридатний.) Існують проблеми безпеки, оскільки деякі типи MIME являють собою виконуваний вміст. Сервери можуть запобігти авто-розпізнаванню MIME, відправивши заголовок X-Content-Type-Options.

Інші способи передачі типу документів

Типи MIME - не єдиний спосіб передати інформацію про тип документа:

  • Іноді використовуються суфікси назви файлів, особливо в Microsoft Windows. Не всі операційні системи вважають ці суфікси значущими (наприклад, Linux і MacOS), і немає гарантії, що вони правильні.
  • Магічні числа. Синтаксис різних форматів дозволяє вивести тип файлу, розглядаючи їхню байтову структуру. Наприклад, GIF-файли починаються з шістнадцяткового значення 47 49 46 38 39 (GIF89), а PNG-файли з 89 50 4E 47 (.PNG). Не всі типи файлів мають магічні числа, тому це також не на 100%.

Див. також