Тип 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');
});
Просто попробуйте выполнить поиск по ключевому слову «‹язык›проверить типы пантомимы», вы можете найти множество библиотек для использования.
использованная литература