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%.