Тип MIME означает «Многоцелевые расширения Интернет-почты», или мы можем просто назвать его «Тип носителя».

Некоторые примеры типов MIME:

HTML-файл имеет MIME-тип text/html.

Изображение JPEG имеет MIME-тип image/jpeg.

Двоичный файл или файл с неизвестным типом может считаться имеющим MIME-тип application/octet-stream.

Типы MIME отличаются от расширений файлов

Следует помнить, что типы MIME отличаются от расширений файлов. В то время как типы MIME — это идентифицирующие коды, встроенные в файл, расширения файлов — это просто идентифицирующие коды для имен файлов.

В среде ОС Unix/Linux мы можем проверить MIME-типы файла с помощью команды file

$ file --mime-type -b <filename>
# Sample:
$ file --mime-type -b an-image.png
image/png
$ file --mime-type -b web.xml
text/xml

Типы MIME — это просто способ именования типов файлов. Строгого правила не существует: один файл с расширением должен быть определенного типа MIME.

Существует несколько способов определения (или, точнее, определения) MIME-типа файла.

  • Проверьте расширение файла и надейтесь, что оно верное. Одним из примеров является то, что если у нас есть файл с .html, мы будем считать, что он имеет тип text/html MIME.
  • Другой способ — проверить содержимое файла и сделать предположение о его типе.

Пример для второго способа: у нас есть файл шаблона, например test.tmpl. При проверке содержимого мы видим много тегов HTML, поэтому мы предполагаем, что файл имеет MIME-тип text/html.

$ file --mime-type test.tmpl
test.tmpl: text/html

Типы MIME важны в веб-мире

Веб-браузеры используют типы MIME, а не расширения файлов, чтобы определить, как они должны обслуживать контент.

Всякий раз, когда браузер загружает ресурс с сервера, он считывает MIME-тип содержимого из тега заголовка Content-Type. С помощью директивы media-type из заголовка ответа браузер может понять, какой MIME-тип у ресурса. В результате браузер понимает, как он должен отображать контент.

Пример заголовка Content-Type:

Content-Type: text/html; charset=UTF-8

В этом случае содержимое имеет тип text/html и закодировано в UTF-8.

Давайте приведем пример iframe .

Как известно, HTML-тег iframe имеет атрибут с именем src для ввода URL-адреса ресурса.

Если URL-адрес является ресурсом с контентом типа text/html, он будет отображаться внутри тега iframe.

Если URL-адрес является ресурсом application/octet-stream , браузер не знает, как его отобразить, в результате вместо этого он выбирает загрузку содержимого.

Как изменить типы MIME для веб-приложений

Как упоминалось выше, типы MIME — это просто способ именования типов файлов. Строгого правила для файла не существует. Мы можем определить типы для наших собственных сервисов, используя конфигурацию.

В большинстве случаев веб-серверы должны определять список типов MIME для списка расширений файлов.

Образец такого файла определения взят из httpd :

https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/docs/conf/mime.types?view=co

# This file maps Internet media types to unique file extension(s).
# Although created for httpd, this file is used by many software systems
# and has been placed in the public domain for unlimited redisribution.
#
# The table below contains both registered and (common) unregistered types.
# A type that has no unique extension can be ignored -- they are listed
# here to guide configurations toward known types and to make it easier to
# identify "new" types.  File extensions are also commonly used to indicate
# content languages and encodings, so choose them carefully.
#
# Internet media types should be registered as described in RFC 4288.
# The registry is at <http://www.iana.org/assignments/media-types/>.
#
# MIME type (lowercased)			Extensions
# ============================================	==========
# application/1d-interleaved-parityfec
# application/3gpdash-qoe-report+xml
# application/3gpp-ims+xml
# application/a2l
# application/activemessage
# application/alto-costmap+json
# application/alto-costmapfilter+json
# application/alto-directory+json
# application/alto-endpointcost+json
# application/alto-endpointcostparams+json
# application/alto-endpointprop+json
# application/alto-endpointpropparams+json
# application/alto-error+json
# application/alto-networkmap+json
# application/alto-networkmapfilter+json
# application/aml
application/andrew-inset			ez
# application/applefile
application/applixware				aw
# application/atf
# application/atfx
application/atom+xml				atom
application/atomcat+xml				atomcat
# application/atomdeleted+xml
# application/atomicmail
application/atomsvc+xml				atomsvc
# application/atxml
# application/auth-policy+xml
# application/bacnet-xdd+zip
# application/batch-smtp
# application/beep+xml
# application/calendar+json
# application/calendar+xml
# application/call-completion
# application/cals-1840
# application/cbor
# application/ccmp+xml
application/ccxml+xml				ccxml
....
image/png					png
...
text/html					html htm

В приведенном выше примере любой файл с расширением .png имеет MIME-типimage/png.

Любой файл с расширением .html или .htm имеет MIME-тип text/html .

Поскольку мы храним этот файл на нашем веб-сервере, мы можем изменять его по своему усмотрению.

Расположение этого mime.types файла отличается для каждого веб-сервера.

Путь конфигурации сервера Apache будет отличаться от местоположения сервера Tomcat. Но идея останется прежней: мы храним файл, чтобы определить, какой тип должен обслуживаться тот или иной ресурс.

Определение типов MIME с помощью языков программирования

В приведенных выше примерах мы используем команду file для определения типа MIME файла. Но в реальном веб-приложении бывают случаи, когда мы хотим проверить его через исходный код. К счастью, в большинстве современных языков программирования для этого есть библиотеки.

В Java мы можем использовать такие классы, как javax.activation.MimetypesFileTypeMap, для сопоставления типов MIME из файла mime.types.

Или в NodeJS, чтобы установить заголовок ответа с типом MIME, мы можем использовать response.setHeader

// Returns content-type = text/plain
const server = http.createServer((req, res) => {
  res.setHeader('Content-Type', 'text/html');
  res.setHeader('X-Foo', 'bar');
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('ok');
});

Просто попробуйте выполнить поиск по ключевому слову «‹язык›проверить типы пантомимы», вы можете найти множество библиотек для использования.

использованная литература