MIME-тип
MIME-тип (называемый «media type», а иногда «content type») — это строка, отправляемая вместе с файлом, которая указывает тип файла. (например, передаваемый аудиофайл может быть помечен как audio/ogg тип, а изображение — image/png ). MIME-тип играет точно такую же роль, как и расширение файла в системе Windows. Когда HTTP-сообщение содержит Content-type заголовок, тело запроса будет парситься в соответствии с MIME-типом, указанным в заголовке.
Узнать больше
Основная информация
Технические справки
- List of MIME types
- Properly Configuring Server MIME Types (en-US)
- Детальная информация об использовании MIME Types в контексте Веб.
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 12 нояб. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Определение MIME-типов
Недавно задался вопросом а сколько байт необходимо для корректного определения mime типа файла. В первую очередь погуглив, полученными ответами не удовлетворился и поэтому решил сам провести маленькое исследование на эту тему.
На изучение данного вопроса меня натолкнула следующая задача: определение MIME-типа файла, находящегося на smb-сервере. Лучшее, что я придумал — копировать кусок файла на локальную машину и потом, по этой части пытаться распознать его MIME-тип.

Для начала расскажу, что я нагуглил и почему мне это не понравилось:
Stack Overflow дает 2 ссылки на википедию:
- File Signature говорит, что в большинстве случаев достаточно 2-4 байтов. Однако к сожалению это не так, например, для такого популярного формата, как pdf.
- List of signatures приводит некоторый список подписей для файлов разных форматов, но он далеко не полный. Потом нашел File Signatures, здесь вроде как все.
Однако вернемся все к тому же pdf. Если верить этим источника, то для определения того, что файл является pdf достаточно четырех байт (0x25 0x50 0x44 0x46), однако исходя из первых четырех байтов libmagic говорил, что MIME-тип pdf-файла — text/plain, а из пяти — верное application/pdf. Затрудняюсь точно ответить с чем это связано, надо смотреть исходники.
Теперь давайте перейдем, собственно говоря, к тому, что сделал я. Я написал очень маленькую программку, которая считывала все файлы из одной директории, копировала первые N байт в другую директорию, а затем по частичным копиям полученных файлов пыталась определить, а что это собственно говоря такое было. И так до тех пор, пока MIME-тип части файла не совпадет с MIME-типом оригинала. По результатам работы программа рапортовала, сколько байт понадобилось для определения того или иного типа. Вот ее код:
#include #include #include #include #include #include #include #include #include #include #define TEST_DIR "test-dir/" #define TMP_DIR "tmp-dir/" magic_t cookie; // Detects how many bytes required for correct MIME-type of this file void detect_size(char *filename) < int bytes = 1; int infd, outfd; char strin[100], strout[100], type[100]; char buf[4096]; strcpy(strin, TEST_DIR); strcat(strin, filename); strcpy(strout, TMP_DIR); strcat(strout, filename); while(1) < // Make a copy of given file infd = open(strin, O_RDONLY); outfd = open(strout, O_RDWR | O_CREAT, 00666); read(infd, &buf, bytes); write(outfd, &buf, bytes); lseek(infd, 0, SEEK_SET); lseek(outfd, 0, SEEK_SET); // Detect mime types of old and new const char *mime_type = magic_descriptor(cookie, infd); strcpy(type, mime_type); mime_type = magic_descriptor(cookie, outfd); // Check if mime type detected correctly if (strcmp(mime_type, type) == 0) < printf("%s detected correctly in %d bytes\n", type, bytes); unlink(strout); return; >unlink(strout); bytes++; > > int main() < DIR *dirfd = opendir(TEST_DIR); struct dirent entry, *result = NULL; cookie = magic_open(MAGIC_MIME_TYPE | MAGIC_ERROR); magic_load(cookie, NULL); while(1) < readdir_r(dirfd, &entry, &result); if (result == NULL) break; // No more entries in this directory if (!strcmp(entry.d_name, ".") || !strcmp(entry.d_name, "..")) continue; // Ignore "." and ".." detect_size(entry.d_name); >magic_close(cookie); closedir(dirfd); exit(EXIT_SUCCESS); >
Потом накидав кучку разных файлов в папку test-dir я начал экспериментировать. Конечно то, что я сделал ни как не тянет на полномасштабное и серьезное исследование, но некоторые результаты все таки интересны. Приведи их краткую сводку:
application/x-sharedlib detected correctly in 18 bytes
application/msword detected correctly in 1793 bytes
image/gif detected correctly in 4 bytes
application/zip detected correctly in 4 bytes
application/x-dosexec detected correctly in 2 bytes
application/vnd.oasis.opendocument.presentation detected correctly in 85 bytes
text/html detected correctly in 14 bytes
image/jpeg detected correctly in 2 bytes
application/x-executable detected correctly in 18 bytes
text/x-makefile detected correctly in 1594 bytes
application/x-executable detected correctly in 18 bytes
application/x-gzip detected correctly in 2 bytes
audio/mpeg detected correctly in 2291 bytes
text/x-c detected correctly in 27 bytes
audio/x-flac detected correctly in 4 bytes
application/pdf detected correctly in 5 bytes
Отмечу некоторые вещи, которые мне показались интересными:
- Ну во-первых, конечно уже упомянутый pdf, который распознается в 5 байт, а не в 4, как вроде бы следовало ожидать.
- И напоследок хочется отметить, что не смотря на всю крутость идеи определять тип файла по первым N байтам она, на мой взгляд, провалилась.
Ну это пожалуй все, что я хотел рассказать в этот раз, не люблю много писать. Надеюсь, что это статья окажется кому-нибудь интересной.
Спасибо за внимание.
Как определить MIME-тип файла по содержимому?
Допустим у нас есть Blob или File без явно прописанного типа, т. е. свойство type пустое.
Существует ли какой-нибудь простой способ определить MIME-тип файла?
Желательно без возни со сравнением магических чисел вручную!
Тестовый стенд для экспериментов: https://nadim.work/zip/
Что я уже пробовал делать
У меня была такая идея, попробовать записать файл в виртуальную файловую систему и прочитать его обратно, по моим предположениям операционная система должна автоматически присвоить правильный MIME-тип, но к сожалению это не сработало и MIME-тип так и не присвоился:
window.webkitRequestFileSystem(window.TEMPORARY, 10*1024*1024, function(fs) < fs.root.getFile(file.name, < create: true >, function (fileEntry) < fileEntry.createWriter(function (fileWriter) < fileWriter.onwriteend = function(e) < console.log('Успех!'); fs.root.getFile(file.name, <>, function (fileEntry) < fileEntry.file(function (new_file) < console.log('Файл успешно записан и прочитан обратно:'); console.dir(new_file); >); >); >; fileWriter.onerror = function(e) < console.log('Ошибка:'); console.dir(e); >; fileWriter.write(file); >, function(err) < console.log('Ошибка:'); console.dir(err); >); >, function(err) < console.log('Ошибка:'); console.dir(err); >); >, function(err) < console.log('Ошибка:'); console.dir(err) >);
- Вопрос задан более двух лет назад
- 771 просмотр
Комментировать
Решения вопроса 0
Ответы на вопрос 1

Программист, философ
Хм, определить MIME можно двумя способами: по расширению файла, если оно указано корректно, и по его содержимому. Если с расширением файла все просто, то файл придется читать, пытаясь сверить первые байты с имеющейся базой сигнатур форматов. Наверняка есть готовые библиотеки.
Ответ написан более двух лет назад
zkrvndm @zkrvndm Автор вопроса
Я вот не нашел готовых библиотек на JavaScript, может вы знаете? Определение типа по формату файла не точное, так как формат не гарантирует тип.

Надим Закиров, а Вам это до зарезу нужно? Иногда игра не стоит свеч, и верным путем будет компромиссное решение. Почему бы не определять типы по расширению файла? Или Вы пишете специфический сервис, где, во-первых, возможен подлог, во-вторых, крайняя необходимость достоверно определять типы файлов? В обычном случае можно предположить, что doc, docx и т.д. — соответствуют своему типу.
MIME types
Медиа тип (так же известный как Multipurpose Internet Mail Extensions или MIME тип) является стандартом, который описывает природу и формат документа, файла или набора байтов. Он определён и стандартизирован в спецификации RFC 6838 .
Организация Internet Assigned Numbers Authority (IANA) является ответственной за все официально признанные MIME типы, и вы можете найти самый последний и полный лист MIME типов на их странице Медиа Типов.
Предупреждение: Важно: Для принятия решения о том, как обрабатывать URL, браузеры используют MIME типы, а не расширения файлов, так что серверам необходимо отправлять правильные MIME типы в Content-Type заголовке ответа. При неточном задавании этого заголовка, браузеры с большой вероятностью будут неправильно интерпретировать и обрабатывать содержание файлов, из-за чего сайт будет работать неверно.
Структура MIME типа
Простейший MIME тип состоит из типа и подтипа — двух строк разделённых наклонной чертой ( / ), без использования пробелов.
тип/подтип
Тип представляет общую категорию, в которой находится тип данных, например video или text . Подтип же строго отождествляется с отдельным типом данных, представляемых данным MIME типом. Например, для MIME типа text , подтипы могут быть plain (простой текст), html (HTML source code) или calendar (для iCalendar .ics ).
Необязательный параметр может быть добавлен для указания дополнительных деталей
тип/подтип;параметр=значение
Например, для MIME типов категории text , необязательный параметр charset может быть задан для уточнения кодировки, используемой в документе. Для объявления, что пересылаемый файл имеет кодировку UTF-8, необходимо использовать MIME тип text/plain;charset=UTF-8 . При не указании параметра charset , его значение автоматически будет задано, как ASCII ( US-ASCII ), если в настройках браузера не будет определено иначе.
MIME типы являются нечувствительными к регистру, но традиционно их пишут строчными буквами, за исключением значений параметров.
Типы
Все типы можно разделить на два класса: дискретные и многокомпонентные. Дискретные типы представляют одиночные файлы, например, одиночный текстовый, музыкальный или видео файл. Многокомпонентные типы представляют документы, составленные из нескольких частей, каждая из которых может иметь свой отдельный MIME тип, или они могут заключать в себе несколько отдельных файлов, передаваемых в одном сообщении. Например, многокомпонентные MIME типы используются для передачи нескольких изображений в одном email.
Дискретные типы
В настоящее время на IANA зарегистрированы следующие дискретные типы:
Любой вид бинарных данных, явно не попадающих ни в одну другую группу типов. Данные, которые будут выполняться или как-либо интерпретироваться, или данные для выполнения, которых необходимо отдельное приложение. Для указания базового типа бинарных данных (данных без определённого типа) используют тип application/octet-stream . Другие распространённые примеры включают application/pdf , application/pkcs8 и application/zip .
Аудио или музыкальные данные. Примеры: audio/mpeg , audio/vorbis .
Тип, зарезервированный для написания примеров, отображающих использование MIME типов. Этот тип никогда не должен использоваться вне примеров кода или документации. example может так же использоваться, как подтип.
Данные шрифтов. Распространённые примеры включают font/woff , font/ttf и font/otf .
Изображения или графические данные, включая векторную и растровую графику, а так же анимированные версии форматов неподвижных изображений, таких как GIF (en-US) или APNG. Распространённые примеры включают image/jpeg , image/png , и image/svg+xml .
Данные моделей для 3D объектов или сцен. Примеры: model/3mf и model/vml .
Любые текстовые данные, так или иначе доступные для чтения человеку, а так же исходный код или текстовые данные для программ. Примеры: text/plain , text/csv и text/html .
Видео данные или файлы. Например, MP4 фильмы ( video/mp4 ).
Любые текстовые документы без определённого подтипа стоит отправлять, как text/plain тип. Аналогичным образом, application/octet-stream тип подойдёт бинарным документам при неопределённом или неизвестном подтипе.
Многокомпонентные типы
Многокомпонентные типы описывают категории разграниченных на части документов, где каждая из частей может иметь свой отдельный MIME тип. При работе с электронными письмами, они могут использоваться для описания нескольких отдельных файлов, передаваемых в одном сообщении. Они представляют составные документы.
За исключением multipart/form-data типа, используемого в POST методе HTML форм, и multipart/byteranges типа, используемом в ответе 206 Partial Content для отправки части документа, HTTP никаким особым образом не обрабатывает многокомпонентные типы, и просто отправляет данные в браузер (который, с большой вероятностью, предложит сохранить переданный файл, тоже не зная как его обработать).
Существуют два многокомпонентных типа:
Сообщение, включающее в себя другие сообщения. Этот тип может использоваться, например, для представления сообщения, которое включают в себя другое переадресованное сообщение, как часть данных, или для отправки больших сообщений по частям, как если бы каждое сообщение отправлялось отдельно. Примеры включают message/rfc822 (для переадресованных или цитируемых сообщений) и message/partial для автоматического разделения одного большого сообщения на несколько небольших и их последующей сборки на стороне получателя.
Данные составленные из нескольких компонентов, каждый из которых может иметь отдельный MIME тип. Примеры включают multipart/form-data (для данных созданных с помощью FormData API) и multipart/byteranges (определённого в RFC 7233: 5.4.1 и используемого в ответах HTTP 206 «Partial Content», когда запрашиваемые данные возвращаются по частям в нескольких сообщениях, как например, при использовании заголовка Range ).
Важные для Web-разработчиков MIME типы
application/octet-stream
Этот тип является базовым для бинарных данных. В связи с тем, что он подразумевает неопределённые бинарные данные, браузеры, как правило, не будут пытаться его обработать каком-либо образом, а вызовут для него диалоговое окно «Сохранить Как», как если бы заголовок ответа Content-Disposition имел значение attachment .
text/plain
Этот тип является базовым для текстовых файлов. Несмотря на то, что он означает «неопределённые текстовые данные», браузеры всё равно могут его отображать.
Примечание: text/plain не означает «любой вид текстовых данных». Если браузер ожидает получения какого-то конкретного типа текстовых данных, то с большой вероятностью он не будет считать text/plain подходящим типом. Например, при загрузке text/plain документа через элемент, браузер не будет его признавать правильным CSS файлом и использовать для применения стилей. Только text/css тип должен использоваться для загрузки CSS документов.
text/css
CSS документы, используемые для стилизации web-страниц должны отправляться, как text/css тип. Большинство браузеров не смогут распознавать CSS документы, загруженные с отличным от text/css MIME типом.
text/html
Все HTML данные должны пересылаться с данным типом. Альтернативные MIME типы для XHTML (например, application/xhtml+xml ) почти не используются в настоящее время.
Примечание: Используйте application/xml или application/xhtml+xml , когда вам необходим строгий синтаксический анализ документов, разделы или элементы, не принадлежащие к пространствам имён HTML/SVG/MathML.
text/javascript
Согласно HTML спецификации: при пересылке JavaScript файлов, всегда должен использоваться MIME тип text/javascript .
По исторически сложившимся причинам, MIME Sniffing Standard (стандарт, определяющий, как браузеры должны интерпретировать медиа типы и выяснять, как обрабатывать данные при неправильно заданных медиа типах) позволяет серверам отправлять JavaScript документы, используя один из нижеперечисленных типов:
- application/javascript
- application/ecmascript
- application/x-ecmascript Non-standard
- application/x-javascript Non-standard
- text/javascript
- text/ecmascript
- text/javascript1.0 Non-standard
- text/javascript1.1 Non-standard
- text/javascript1.2 Non-standard
- text/javascript1.3 Non-standard
- text/javascript1.4 Non-standard
- text/javascript1.5 Non-standard
- text/jscript Non-standard
- text/livescript Non-standard
- text/x-ecmascript Non-standard
- text/x-javascript Non-standard
Примечание: Несмотря на то, что некоторые user agent могут поддерживать какие-то из вышеперечисленных типов, вы всегда должны использовать text/javascript . Это единственный MIME тип, который гарантированно будет работать в настоящее время и в будущем.
Иногда вы можете заметить использование text/javascript MIME типа в связке с параметром charset , для уточнения кодировки, в которой был написан файл. Такое определение MIME типа является неправильным, и в большинстве случаев браузеры не станут загружать скрипт, передаваемый с таким типом.
Типы изображений
Файлы, MIME типом которых является image , содержат в себе данные изображений. Подтип определяет, какой конкретный формат изображения представлен в данных.
Лишь несколько типов изображений (en-US) достаточно распространены, чтобы безопасно использоваться на веб-страницах.
Аудио и видео типы
Так же как в случае с изображениями, стандарт HTML не обязывает браузеры поддерживать какие-либо определённые форматы и кодеки для и элементов, так что при их выборе, важно брать в расчёт целевую аудиторию и диапазон браузеров (а так же версии этих браузеров), которые она может использовать.
Наше руководство по медиа форматам (en-US) предоставляет список общепринятых типов, включая информацию об особых случаях при их использовании, их недостатках, совместимости, а так же других деталях.
Руководства по аудио (en-US) и видео (en-US) кодекам перечисляют часто поддерживаемые браузерами кодеки, предоставляя детали по их совместимости и техническую информацию, например как много аудио каналов они поддерживают, какой тип сжатия используют, и так далее. Руководство по используемым в WebRTC кодекам развивает эту тему ещё дальше, конкретно описывая кодеки, поддерживаемые популярными браузерами, так чтобы вы могли выбрать кодеки, которые имеют наилучшую поддержку в диапазоне браузеров по вашему выбору.
Что касается MIME типов для аудио и видео файлов, то чаще всего они указывают на формат контейнера (тип файла). Необязательный параметр codecs может быть добавлен к MIME типу для более точного указания, какой кодек и параметры использовались для пересылаемого файла.
Ниже перечислены наиболее часто используемые на веб-страницах MIME типы. Обратите внимание, что это не полный перечень всех доступных типов. Более полный список поддерживаемых форматов может быть найден в руководстве по медиа форматам (en-US) .
| MIME тип | Аудио или видео тип |
|---|---|
| audio/wave audio/wav audio/x-wav audio/x-pn-wav | Аудио файл WAVE формата. С PCM аудио кодеком (WAVE кодек «1»), считающимся наиболее поддерживаемым, а так же другими, имеющими ограниченную поддержку. |
| audio/webm | Аудио файл формата WebM. С Vorbis и Opus официально поддерживаемыми WebM спецификацией аудио кодеками. |
| video/webm | Видео файл, с возможной аудио дорожкой, формата WebM. С VP8 и VP9, как наиболее распространёнными видео кодеками; Vorbis и Opus, как наиболее распространёнными аудио кодеками. |
| audio/ogg | Аудио файл формата OGG. С Vorbis, как наиболее распространённым аудио кодеком. Хотя на данный момент имеется поддержка и Opus кодека. |
| video/ogg | Видео файл, с возможной аудио дорожкой, в формате OGG. Где Theora – наиболее часто встречающийся видео кодек и Vorbis — наиболее часто встречающийся аудио кодек. Хотя использование кодека Opus становится всё более распространённым. |
| application/ogg | Аудио или видео формата OGG. Где Theora – наиболее часто встречающийся видео кодек и Vorbis — наиболее часто встречающийся аудио кодек. |
multipart/form-data
multipart/form-data тип может быть использован при отправке значений из заполненной HTML Формы на сервер.
Как многокомпонентный тип документа, он состоит из различных частей, разделённых специальной границей (строкой, начинающейся с двух чёрточек — ), где каждая часть представляет собой отдельную сущность и имеет отдельные HTTP заголовки Content-Disposition и Content-Type для загружаемых файлов.
Content-Type: multipart/form-data; boundary=aBoundaryString (other headers associated with the multipart document as a whole) --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 action="http://localhost:8000/" method="post" enctype="multipart/form-data"> label>Name: input name="myTextField" value="Test" />label> label>input type="checkbox" name="myCheckBox" /> Checklabel> label >Upload file: input type="file" name="myFile" value="test.txt" />label> button>Send the filebutton> 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
multipart/byteranges MIME тип используется для отправки данных в браузер по частям.
При отправке кода состояния 206 Partial Content , этот MIME тип будет означать, что документ состоит из нескольких частей, по одной для каждого отдельно запрашиваемого диапазона. Аналогично с остальными многокомпонентными типами, заголовок Content-Type используется для объявления границы boundary , разделяющей документ на отдельные компоненты. Каждый компонент имеет заголовок Content-Type , описывающий тип сегмента данных, и Content-Range (en-US) , описывающий его диапазон.
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" />Важность задания правильного MIME типа
Большинство серверов отправляет ресурсы неопределённого типа, как application/octet-stream MIME тип. Большинство же браузеров, в целях безопасности, не позволяет их никак обрабатывать, вынуждая пользователя сохранять их на жёсткий диск, для дальнейшего использования.
Несколько советов по правильной настройке MIME типов на серверах:
- RAR-сжатые файлы. В этом случае самым правильным вариантом было бы задать тип изначального ресурса; но это не всегда выполнимо, так как .RAR файлы могут хранить в себе несколько типов данных. Тогда, настройте сервер на отправку application/x-rar-compressed MIME типа вместе с RAR ресурсами.
- Аудио и видео. Только ресурсы с правильно заданными MIME типами могут производиться в и элементах. Убедитесь, что вы используете правильные типы для аудио и видео данных (en-US).
- Запатентованные типы файлов. Избегайте использования application/octet-stream при их отправке, так как большинство браузеров не позволит определять способы обработки (например, "Открыть в Word") для этого базового MIME типа. Используйте специальные типы, например application/vnd.mspowerpoint , чтобы позволить пользователям открывать загруженный ресурс в программе по их выбору.
MIME sniffing
В отсутствии заданного MIME типа, или в определённых случаях, когда браузеры полагают, что MIME тип задан неправильно, они могут выполнять MIME sniffing — попытку угадать правильный MIME тип, анализируя характеристики ресурса.
Каждый браузер выполняет MIME sniffing по-своему и при разных условиях (например, Safari будет смотреть на расширение файла, если переданный MIME тип является неподходящим для документа). В этих случаях могут присутствовать опасения по поводу безопасности, так как некоторые MIME типы представляют исполняемые файлы. Сервера имеют возможность предотвращать MIME sniffing, отправляя X-Content-Type-Options заголовок ответа.
Другие методы сообщения о типе ресурса
MIME типы не являются единственным способом сообщения типа документа:
- Суффиксы в названиях файлов могут указывать на тип документа, главным образом на Microsoft Windows. Но не все операционные системы могут считать их имеющими смысл (например, Linux или MacOS). А так же нет никакой гарантии, что они будут указывать на правильный тип.
- Магические числа. Синтаксисы различных форматов позволяют узнавать их тип, через анализ их структуры байтов. Например, GIF файлы начинаются с 47 49 46 38 39 шестнадцатеричного значения ( GIF89 ), а PNG файлы с 89 50 4E 47 ( .PNG ). Опять же, не все типы документов имеют магические числа, так что этот подход так же не надёжен на 100%.
Смотрите также
- Медиа технологии в web (en-US)
- Руководство по медиа типам и форматам в web (en-US)
- Настраивание MIME типов на стороне сервера (en-US)
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 2 дек. 2023 г. by MDN contributors.
Your blueprint for a better internet.