MIME / Content-Type

MIME (Multipurpose Internet Mail Extensions) — стандарт кодирования типа и содержимого файлов. Изначально для email (RFC 2045-2049, 1996), потом внедрили в HTTP как заголовок Content-Type. Именно MIME говорит браузеру: «этот массив байтов — картинка JPEG», «это HTML», «это JSON».

Формат MIME-типа

type/subtype; parameter1=value1; parameter2=value2

text/html; charset=utf-8
image/png
application/json
multipart/form-data; boundary=------abc123

Основные типы (5 top-level + composite)

ТипЧтоПримеры
textЧитаемый текстtext/html, text/plain, text/css, text/csv, text/javascript
imageИзображенияimage/jpeg, image/png, image/gif, image/webp, image/avif, image/svg+xml
audioАудиоaudio/mpeg, audio/ogg, audio/wav, audio/webm, audio/flac
videoВидеоvideo/mp4, video/webm, video/quicktime, video/x-matroska
applicationВсё остальное — двоичка, форматы приложенийapplication/json, application/pdf, application/octet-stream
fontШрифты (RFC 8081)font/woff, font/woff2, font/ttf, font/otf
model3D-моделиmodel/gltf+json, model/obj
multipartComposite: несколько частейmultipart/form-data, multipart/mixed, multipart/alternative
messageComposite: обёртка сообщенияmessage/rfc822, message/http

application/* — важные

ТипЧто
application/jsonJSON
application/xmlXML
application/pdfPDF
application/zipZIP-архив
application/gzipgzip
application/x-tartar
application/octet-stream«Просто байты», универсальный fallback
application/x-www-form-urlencodedФорма (key=value&key2=value2)
application/wasmWebAssembly
application/manifest+jsonPWA manifest
application/ld+jsonJSON-LD (Linked Data)
application/vnd.ms-excelxls
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetxlsx (длиннющий)

Параметры

multipart/form-data

Формат отправки HTML-формы с файлами:

POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----abc123

------abc123
Content-Disposition: form-data; name="username"

alice
------abc123
Content-Disposition: form-data; name="avatar"; filename="pic.png"
Content-Type: image/png

<binary data>
------abc123--

Определение MIME

  1. По расширению файла (обычно на сервере). База: /etc/mime.types, /usr/share/mime/.
  2. Magic-bytes (по содержимому). Утилиты file, libmagic. PNG начинается с 89 50 4E 47, JPEG с FF D8 FF.
  3. Guess из имени (Python mimetypes.guess_type, Node mime).

MIME sniffing

Браузер иногда не доверяет заголовку Content-Type и пытается определить тип сам. Причина: раньше серверы отправляли всё как text/plain, а браузер должен был показать HTML/картинку.

Проблема: если сервер отдаёт user-generated контент как text/plain, но там внутри HTML со скриптом — MIME sniffing может превратить это в text/html и выполнить скрипт. XSS.

Защита: заголовок X-Content-Type-Options: nosniff — «не гадай, доверяй только моему Content-Type».

Vendor-специфичные (vnd)

Префикс vnd. — vendor-specific. Заявленный в IANA тип для конкретного продукта:

Experimental (x-)

Префикс x- — исторически «неофициальный». Deprecated по RFC 6648, но всё ещё встречается:

Content-Disposition

Отдельный заголовок — говорит браузеру: «показать» или «скачать»:

Content-Disposition: inline                       # показать в браузере
Content-Disposition: attachment                    # скачать
Content-Disposition: attachment; filename="doc.pdf"  # с именем файла

См. также