Как узнать mime type файла
Перейти к содержимому

Как узнать mime type файла

  • автор:

Определение MIME-типов

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

На изучение данного вопроса меня натолкнула следующая задача: определение MIME-типа файла, находящегося на smb-сервере. Лучшее, что я придумал — копировать кусок файла на локальную машину и потом, по этой части пытаться распознать его MIME-тип.

Для начала расскажу, что я нагуглил и почему мне это не понравилось:

Stack Overflow дает 2 ссылки на википедию:

  1. File Signature говорит, что в большинстве случаев достаточно 2-4 байтов. Однако к сожалению это не так, например, для такого популярного формата, как pdf.
  2. 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 type у файла без расширения

Фронты думают что эта информация может быть получена только на сервере, т.е. серверная машина – «особая» вычислительная мощность, позволяющая получить «особые» данные файла. Как-то так.

znenyegvkby ★
( 31.08.16 19:35:57 MSK )
Последнее исправление: znenyegvkby 31.08.16 19:36:14 MSK (всего исправлений: 1)

Ответ на: комментарий от znenyegvkby 31.08.16 19:35:57 MSK

фронты тупо не думают и не гуглят, не есть такие которые думают и гулят но их видел в следовых количествах

Deleted
( 31.08.16 19:39:13 MSK )

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

waker ★★★★★
( 31.08.16 20:06:12 MSK )
Ответ на: комментарий от Deleted 31.08.16 18:54:28 MSK

Не обращай
Про Mdn любой jr. Front-end знает

mystery ★★
( 31.08.16 20:10:18 MSK )
Ответ на: комментарий от waker 31.08.16 20:06:12 MSK

Не, это cordova, юзер в апп может прикрепить файл, к сообщению, весь механизм есть и он работает(выбор файла, заливка на сервер и тд), до этого момента можно было только прикреплять jpg или открывать камеру и делать снимок, ну и в коде просто ручками вписан mime image/jpg 🙂 но сейчас расширяем функционал и требуется давать возможность заливать pdf и doc. Но по какой-то странной причине на некоторых устройствах приходит строка (путь к файлу) без расширения. Вроде логично mime получать по расширению.

Ну тут ворчливые ребята натолкнули на мысль о file api вроде в cordova есть какая-то обертка для него, завтра поковыряю

Deleted
( 31.08.16 20:19:13 MSK )
Ответ на: комментарий от Deleted 31.08.16 18:54:28 MSK

а браузер присваивает майм тайп при аплоаде не по расширению?

anonymous
( 31.08.16 20:31:39 MSK )
Ответ на: комментарий от anonymous 31.08.16 20:31:39 MSK

Ну наконец, хоть кто то понимает о чем я

Как узнать mime type файла

MIME — Multipurpose Internet Mail Extension — стандарт для определения типа передаваемой информации и механизмов ее обработки. Он сообщает браузерам о том, как им надо обращаться с запрошенными файлами, имеющими то или иное расширение. Так, например, если сервер отдает браузеру в заголовках тип MIME «text/html» для файлов с расширениями htm, html и shtml, то браузер интерпретирует все файлы с этими расширениями как файлы HTML. Также очень желательно передавать корректный MIME-type при отдаче файлов скриптом в антилич-системах.

Недавно я ковырялся в одной коммерческой CMS с закрытым кодом и нашел там одну полезную функцию с большим списком MIME-типов для различных расширений файлов (всего около 400). Реализация самой функции была сделана ужасно, поэтому я ее тут даже приводить не буду. Список я немного почистил и сохранил в удобном для работы виде. Функцию тоже переписал:

  1. //———————————————————-
  2. // Функция определения MIME-типа файла по его расширению
  3. //———————————————————-
  4. function get_mime_type ( $ext )
  5. // Массив с MIME-типами
  6. global $mimetypes ;
  7. // Расширение в нижний регистр
  8. $ext = trim ( strtolower ( $ext ));
  9. if ( $ext != » && isset( $mimetypes [ $ext ]))
  10. // Если есть такой MIME-тип, то вернуть его
  11. return $mimetypes [ $ext ];
  12. >
  13. else
  14. // Иначе вернуть дефолтный MIME-тип
  15. return «application/force-download» ;
  16. >
  17. >

На входе функция получает расширение файла без точки, например, «zip», «MP3», и возвращает его MIME-тип, если его можно определить, или дефолтный, если расширение не содержится в списке. Расширение файла удобнее всего получить функцией pathinfo.

А вот и сам список, оформленный в виде массива и упорядоченный по алфавиту. По мере надобности вы можете самостоятельно добавлять в него нужные вам значения.

  1. $mimetypes = Array (
  2. «123» => «application/vnd.lotus-1-2-3» ,
  3. «3ds» => «image/x-3ds» ,
  4. «669» => «audio/x-mod» ,
  5. «a» => «application/x-archive» ,
  6. «abw» => «application/x-abiword» ,
  7. «ac3» => «audio/ac3» ,
  8. «adb» => «text/x-adasrc» ,
  9. «ads» => «text/x-adasrc» ,
  10. «afm» => «application/x-font-afm» ,
  11. «ag» => «image/x-applix-graphics» ,
  12. «ai» => «application/illustrator» ,
  13. «aif» => «audio/x-aiff» ,
  14. «aifc» => «audio/x-aiff» ,
  15. «aiff» => «audio/x-aiff» ,
  16. «al» => «application/x-perl» ,
  17. «arj» => «application/x-arj» ,
  18. «as» => «application/x-applix-spreadsheet» ,
  19. «asc» => «text/plain» ,
  20. «asf» => «video/x-ms-asf» ,
  21. «asp» => «application/x-asp» ,
  22. «asx» => «video/x-ms-asf» ,
  23. «au» => «audio/basic» ,
  24. «avi» => «video/x-msvideo» ,
  25. «aw» => «application/x-applix-word» ,
  26. «bak» => «application/x-trash» ,
  27. «bcpio» => «application/x-bcpio» ,
  28. «bdf» => «application/x-font-bdf» ,
  29. «bib» => «text/x-bibtex» ,
  30. «bin» => «application/octet-stream» ,
  31. «blend» => «application/x-blender» ,
  32. «blender» => «application/x-blender» ,
  33. «bmp» => «image/bmp» ,
  34. «bz» => «application/x-bzip» ,
  35. «bz2» => «application/x-bzip» ,
  36. «c» => «text/x-csrc» ,
  37. «c++» => «text/x-c++src» ,
  38. «cc» => «text/x-c++src» ,
  39. «cdf» => «application/x-netcdf» ,
  40. «cdr» => «application/vnd.corel-draw» ,
  41. «cer» => «application/x-x509-ca-cert» ,
  42. «cert» => «application/x-x509-ca-cert» ,
  43. «cgi» => «application/x-cgi» ,
  44. «cgm» => «image/cgm» ,
  45. «chrt» => «application/x-kchart» ,
  46. «class» => «application/x-java» ,
  47. «cls» => «text/x-tex» ,
  48. «cpio» => «application/x-cpio» ,
  49. «cpp» => «text/x-c++src» ,
  50. «crt» => «application/x-x509-ca-cert» ,
  51. «cs» => «text/x-csharp» ,
  52. «csh» => «application/x-shellscript» ,
  53. «css» => «text/css» ,
  54. «cssl» => «text/css» ,
  55. «csv» => «text/x-comma-separated-values» ,
  56. «cur» => «image/x-win-bitmap» ,
  57. «cxx» => «text/x-c++src» ,
  58. «dat» => «video/mpeg» ,
  59. «dbf» => «application/x-dbase» ,
  60. «dc» => «application/x-dc-rom» ,
  61. «dcl» => «text/x-dcl» ,
  62. «dcm» => «image/x-dcm» ,
  63. «deb» => «application/x-deb» ,
  64. «der» => «application/x-x509-ca-cert» ,
  65. «desktop» => «application/x-desktop» ,
  66. «dia» => «application/x-dia-diagram» ,
  67. «diff» => «text/x-patch» ,
  68. «djv» => «image/vnd.djvu» ,
  69. «djvu» => «image/vnd.djvu» ,
  70. «doc» => «application/vnd.ms-word» ,
  71. «dsl» => «text/x-dsl» ,
  72. «dtd» => «text/x-dtd» ,
  73. «dvi» => «application/x-dvi» ,
  74. «dwg» => «image/vnd.dwg» ,
  75. «dxf» => «image/vnd.dxf» ,
  76. «egon» => «application/x-egon» ,
  77. «el» => «text/x-emacs-lisp» ,
  78. «eps» => «image/x-eps» ,
  79. «epsf» => «image/x-eps» ,
  80. «epsi» => «image/x-eps» ,
  81. «etheme» => «application/x-e-theme» ,
  82. «etx» => «text/x-setext» ,
  83. «exe» => «application/x-ms-dos-executable» ,
  84. «ez» => «application/andrew-inset» ,
  85. «f» => «text/x-fortran» ,
  86. «fig» => «image/x-xfig» ,
  87. «fits» => «image/x-fits» ,
  88. «flac» => «audio/x-flac» ,
  89. «flc» => «video/x-flic» ,
  90. «fli» => «video/x-flic» ,
  91. «flw» => «application/x-kivio» ,
  92. «fo» => «text/x-xslfo» ,
  93. «g3» => «image/fax-g3» ,
  94. «gb» => «application/x-gameboy-rom» ,
  95. «gcrd» => «text/x-vcard» ,
  96. «gen» => «application/x-genesis-rom» ,
  97. «gg» => «application/x-sms-rom» ,
  98. «gif» => «image/gif» ,
  99. «glade» => «application/x-glade» ,
  100. «gmo» => «application/x-gettext-translation» ,
  101. «gnc» => «application/x-gnucash» ,
  102. «gnucash» => «application/x-gnucash» ,
  103. «gnumeric» => «application/x-gnumeric» ,
  104. «gra» => «application/x-graphite» ,
  105. «gsf» => «application/x-font-type1» ,
  106. «gtar» => «application/x-gtar» ,
  107. «gz» => «application/x-gzip» ,
  108. «h» => «text/x-chdr» ,
  109. «h++» => «text/x-chdr» ,
  110. «hdf» => «application/x-hdf» ,
  111. «hh» => «text/x-c++hdr» ,
  112. «hp» => «text/x-chdr» ,
  113. «hpgl» => «application/vnd.hp-hpgl» ,
  114. «hs» => «text/x-haskell» ,
  115. «htm» => «text/html» ,
  116. «html» => «text/html» ,
  117. «icb» => «image/x-icb» ,
  118. «ico» => «image/x-ico» ,
  119. «ics» => «text/calendar» ,
  120. «idl» => «text/x-idl» ,
  121. «ief» => «image/ief» ,
  122. «iff» => «image/x-iff» ,
  123. «ilbm» => «image/x-ilbm» ,
  124. «iso» => «application/x-cd-image» ,
  125. «it» => «audio/x-it» ,
  126. «jar» => «application/x-jar» ,
  127. «java» => «text/x-java» ,
  128. «jng» => «image/x-jng» ,
  129. «jp2» => «image/jpeg2000» ,
  130. «jpe» => «image/jpeg» ,
  131. «jpeg» => «image/jpeg» ,
  132. «jpg» => «image/jpeg» ,
  133. «jpr» => «application/x-jbuilder-project» ,
  134. «jpx» => «application/x-jbuilder-project» ,
  135. «js» => «application/x-javascript» ,
  136. «karbon» => «application/x-karbon» ,
  137. «kdelnk» => «application/x-desktop» ,
  138. «kfo» => «application/x-kformula» ,
  139. «kil» => «application/x-killustrator» ,
  140. «kon» => «application/x-kontour» ,
  141. «kpm» => «application/x-kpovmodeler» ,
  142. «kpr» => «application/x-kpresenter» ,
  143. «kpt» => «application/x-kpresenter» ,
  144. «kra» => «application/x-krita» ,
  145. «ksp» => «application/x-kspread» ,
  146. «kud» => «application/x-kugar» ,
  147. «kwd» => «application/x-kword» ,
  148. «kwt» => «application/x-kword» ,
  149. «la» => «application/x-shared-library-la» ,
  150. «lha» => «application/x-lha» ,
  151. «lhs» => «text/x-literate-haskell» ,
  152. «lhz» => «application/x-lhz» ,
  153. «log» => «text/x-log» ,
  154. «ltx» => «text/x-tex» ,
  155. «lwo» => «image/x-lwo» ,
  156. «lwob» => «image/x-lwo» ,
  157. «lws» => «image/x-lws» ,
  158. «lyx» => «application/x-lyx» ,
  159. «lzh» => «application/x-lha» ,
  160. «lzo» => «application/x-lzop» ,
  161. «m» => «text/x-objcsrc» ,
  162. «m15» => «audio/x-mod» ,
  163. «m3u» => «audio/x-mpegurl» ,
  164. «man» => «application/x-troff-man» ,
  165. «md» => «application/x-genesis-rom» ,
  166. «me» => «text/x-troff-me» ,
  167. «mgp» => «application/x-magicpoint» ,
  168. «mid» => «audio/midi» ,
  169. «midi» => «audio/midi» ,
  170. «mif» => «application/x-mif» ,
  171. «mkv» => «application/x-matroska» ,
  172. «mm» => «text/x-troff-mm» ,
  173. «mml» => «text/mathml» ,
  174. «mng» => «video/x-mng» ,
  175. «moc» => «text/x-moc» ,
  176. «mod» => «audio/x-mod» ,
  177. «moov» => «video/quicktime» ,
  178. «mov» => «video/quicktime» ,
  179. «movie» => «video/x-sgi-movie» ,
  180. «mp2» => «video/mpeg» ,
  181. «mp3» => «audio/x-mp3» ,
  182. «mpe» => «video/mpeg» ,
  183. «mpeg» => «video/mpeg» ,
  184. «mpg» => «video/mpeg» ,
  185. «ms» => «text/x-troff-ms» ,
  186. «msod» => «image/x-msod» ,
  187. «msx» => «application/x-msx-rom» ,
  188. «mtm» => «audio/x-mod» ,
  189. «n64» => «application/x-n64-rom» ,
  190. «nc» => «application/x-netcdf» ,
  191. «nes» => «application/x-nes-rom» ,
  192. «nsv» => «video/x-nsv» ,
  193. «o» => «application/x-object» ,
  194. «obj» => «application/x-tgif» ,
  195. «oda» => «application/oda» ,
  196. «ogg» => «application/ogg» ,
  197. «old» => «application/x-trash» ,
  198. «oleo» => «application/x-oleo» ,
  199. «p» => «text/x-pascal» ,
  200. «p12» => «application/x-pkcs12» ,
  201. «p7s» => «application/pkcs7-signature» ,
  202. «pas» => «text/x-pascal» ,
  203. «patch» => «text/x-patch» ,
  204. «pbm» => «image/x-portable-bitmap» ,
  205. «pcd» => «image/x-photo-cd» ,
  206. «pcf» => «application/x-font-pcf» ,
  207. «pcl» => «application/vnd.hp-pcl» ,
  208. «pdb» => «application/vnd.palm» ,
  209. «pdf» => «application/pdf» ,
  210. «pem» => «application/x-x509-ca-cert» ,
  211. «perl» => «application/x-perl» ,
  212. «pfa» => «application/x-font-type1» ,
  213. «pfb» => «application/x-font-type1» ,
  214. «pfx» => «application/x-pkcs12» ,
  215. «pgm» => «image/x-portable-graymap» ,
  216. «pgn» => «application/x-chess-pgn» ,
  217. «pgp» => «application/pgp» ,
  218. «php» => «application/x-php» ,
  219. «php3» => «application/x-php» ,
  220. «php4» => «application/x-php» ,
  221. «pict» => «image/x-pict» ,
  222. «pict1» => «image/x-pict» ,
  223. «pict2» => «image/x-pict» ,
  224. «pl» => «application/x-perl» ,
  225. «pls» => «audio/x-scpls» ,
  226. «pm» => «application/x-perl» ,
  227. «png» => «image/png» ,
  228. «pnm» => «image/x-portable-anymap» ,
  229. «po» => «text/x-gettext-translation» ,
  230. «pot» => «text/x-gettext-translation-template» ,
  231. «ppm» => «image/x-portable-pixmap» ,
  232. «pps» => «application/vnd.ms-powerpoint» ,
  233. «ppt» => «application/vnd.ms-powerpoint» ,
  234. «ppz» => «application/vnd.ms-powerpoint» ,
  235. «ps» => «application/postscript» ,
  236. «psd» => «image/x-psd» ,
  237. «psf» => «application/x-font-linux-psf» ,
  238. «psid» => «audio/prs.sid» ,
  239. «pw» => «application/x-pw» ,
  240. «py» => «application/x-python» ,
  241. «pyc» => «application/x-python-bytecode» ,
  242. «pyo» => «application/x-python-bytecode» ,
  243. «qif» => «application/x-qw» ,
  244. «qt» => «video/quicktime» ,
  245. «qtvr» => «video/quicktime» ,
  246. «ra» => «audio/x-pn-realaudio» ,
  247. «ram» => «audio/x-pn-realaudio» ,
  248. «rar» => «application/x-rar» ,
  249. «ras» => «image/x-cmu-raster» ,
  250. «rdf» => «text/rdf» ,
  251. «rej» => «application/x-reject» ,
  252. «rgb» => «image/x-rgb» ,
  253. «rle» => «image/rle» ,
  254. «rm» => «audio/x-pn-realaudio» ,
  255. «roff» => «application/x-troff» ,
  256. «rpm» => «application/x-rpm» ,
  257. «rss» => «text/rss» ,
  258. «rtf» => «application/rtf» ,
  259. «rtx» => «text/richtext» ,
  260. «s3m» => «audio/x-s3m» ,
  261. «sam» => «application/x-amipro» ,
  262. «scm» => «text/x-scheme» ,
  263. «sda» => «application/vnd.stardivision.draw» ,
  264. «sdc» => «application/vnd.stardivision.calc» ,
  265. «sdd» => «application/vnd.stardivision.impress» ,
  266. «sdp» => «application/vnd.stardivision.impress» ,
  267. «sds» => «application/vnd.stardivision.chart» ,
  268. «sdw» => «application/vnd.stardivision.writer» ,
  269. «sgi» => «image/x-sgi» ,
  270. «sgl» => «application/vnd.stardivision.writer» ,
  271. «sgm» => «text/sgml» ,
  272. «sgml» => «text/sgml» ,
  273. «sh» => «application/x-shellscript» ,
  274. «shar» => «application/x-shar» ,
  275. «siag» => «application/x-siag» ,
  276. «sid» => «audio/prs.sid» ,
  277. «sik» => «application/x-trash» ,
  278. «slk» => «text/spreadsheet» ,
  279. «smd» => «application/vnd.stardivision.mail» ,
  280. «smf» => «application/vnd.stardivision.math» ,
  281. «smi» => «application/smil» ,
  282. «smil» => «application/smil» ,
  283. «sml» => «application/smil» ,
  284. «sms» => «application/x-sms-rom» ,
  285. «snd» => «audio/basic» ,
  286. «so» => «application/x-sharedlib» ,
  287. «spd» => «application/x-font-speedo» ,
  288. «sql» => «text/x-sql» ,
  289. «src» => «application/x-wais-source» ,
  290. «stc» => «application/vnd.sun.xml.calc.template» ,
  291. «std» => «application/vnd.sun.xml.draw.template» ,
  292. «sti» => «application/vnd.sun.xml.impress.template» ,
  293. «stm» => «audio/x-stm» ,
  294. «stw» => «application/vnd.sun.xml.writer.template» ,
  295. «sty» => «text/x-tex» ,
  296. «sun» => «image/x-sun-raster» ,
  297. «sv4cpio» => «application/x-sv4cpio» ,
  298. «sv4crc» => «application/x-sv4crc» ,
  299. «svg» => «image/svg+xml» ,
  300. «swf» => «application/x-shockwave-flash» ,
  301. «sxc» => «application/vnd.sun.xml.calc» ,
  302. «sxd» => «application/vnd.sun.xml.draw» ,
  303. «sxg» => «application/vnd.sun.xml.writer.global» ,
  304. «sxi» => «application/vnd.sun.xml.impress» ,
  305. «sxm» => «application/vnd.sun.xml.math» ,
  306. «sxw» => «application/vnd.sun.xml.writer» ,
  307. «sylk» => «text/spreadsheet» ,
  308. «t» => «application/x-troff» ,
  309. «tar» => «application/x-tar» ,
  310. «tcl» => «text/x-tcl» ,
  311. «tcpalette» => «application/x-terminal-color-palette» ,
  312. «tex» => «text/x-tex» ,
  313. «texi» => «text/x-texinfo» ,
  314. «texinfo» => «text/x-texinfo» ,
  315. «tga» => «image/x-tga» ,
  316. «tgz» => «application/x-compressed-tar» ,
  317. «theme» => «application/x-theme» ,
  318. «tif» => «image/tiff» ,
  319. «tiff» => «image/tiff» ,
  320. «tk» => «text/x-tcl» ,
  321. «torrent» => «application/x-bittorrent» ,
  322. «tr» => «application/x-troff» ,
  323. «ts» => «application/x-linguist» ,
  324. «tsv» => «text/tab-separated-values» ,
  325. «ttf» => «application/x-font-ttf» ,
  326. «txt» => «text/plain» ,
  327. «tzo» => «application/x-tzo» ,
  328. «ui» => «application/x-designer» ,
  329. «uil» => «text/x-uil» ,
  330. «ult» => «audio/x-mod» ,
  331. «uni» => «audio/x-mod» ,
  332. «uri» => «text/x-uri» ,
  333. «url» => «text/x-uri» ,
  334. «ustar» => «application/x-ustar» ,
  335. «vcf» => «text/x-vcalendar» ,
  336. «vcs» => «text/x-vcalendar» ,
  337. «vct» => «text/x-vcard» ,
  338. «vob» => «video/mpeg» ,
  339. «voc» => «audio/x-voc» ,
  340. «vor» => «application/vnd.stardivision.writer» ,
  341. «vpp» => «application/x-extension-vpp» ,
  342. «wav» => «audio/x-wav» ,
  343. «wb1» => «application/x-quattropro» ,
  344. «wb2» => «application/x-quattropro» ,
  345. «wb3» => «application/x-quattropro» ,
  346. «wk1» => «application/vnd.lotus-1-2-3» ,
  347. «wk3» => «application/vnd.lotus-1-2-3» ,
  348. «wk4» => «application/vnd.lotus-1-2-3» ,
  349. «wks» => «application/vnd.lotus-1-2-3» ,
  350. «wmf» => «image/x-wmf» ,
  351. «wml» => «text/vnd.wap.wml» ,
  352. «wmv» => «video/x-ms-wmv» ,
  353. «wpd» => «application/vnd.wordperfect» ,
  354. «wpg» => «application/x-wpg» ,
  355. «wri» => «application/x-mswrite» ,
  356. «wrl» => «model/vrml» ,
  357. «xac» => «application/x-gnucash» ,
  358. «xbel» => «application/x-xbel» ,
  359. «xbm» => «image/x-xbitmap» ,
  360. «xcf» => «image/x-xcf» ,
  361. «xhtml» => «application/xhtml+xml» ,
  362. «xi» => «audio/x-xi» ,
  363. «xla» => «application/vnd.ms-excel» ,
  364. «xlc» => «application/vnd.ms-excel» ,
  365. «xld» => «application/vnd.ms-excel» ,
  366. «xll» => «application/vnd.ms-excel» ,
  367. «xlm» => «application/vnd.ms-excel» ,
  368. «xls» => «application/vnd.ms-excel» ,
  369. «xlt» => «application/vnd.ms-excel» ,
  370. «xlw» => «application/vnd.ms-excel» ,
  371. «xm» => «audio/x-xm» ,
  372. «xmi» => «text/x-xmi» ,
  373. «xml» => «text/xml» ,
  374. «xpm» => «image/x-xpixmap» ,
  375. «xsl» => «text/x-xslt» ,
  376. «xslfo» => «text/x-xslfo» ,
  377. «xslt» => «text/x-xslt» ,
  378. «xwd» => «image/x-xwindowdump» ,
  379. «z» => «application/x-compress» ,
  380. «zabw» => «application/x-abiword» ,
  381. «zip» => «application/zip» ,
  382. «zoo» => «application/x-zoo»
  383. );

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

MIME-типы (типы медиа данных)

Как мы уже знаем, на сервере может храниться информация абсолютно разных форматов – изображения, аудиофайлы, документы и т.д. Когда клиент делает запрос на сервер, он (если все хорошо) получает в ответ то, что просил. И вот тут возникает проблема. Как клиент может определить, какие именно данные пришли с сервера, какой тип данных? Ведь картинки бывают разных форматов, документы бывают разных форматов.

На сервере может храниться информация разных форматов

На сервере может храниться информация разных форматов

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

MIME-тип – это специальная текстовая метка, которая прикрепляется к передаваемому по протоколу HTTP объекту и описывает тип этого объекта.

MIME-тип отправляется вместе с документом

MIME-тип отправляется вместе с документом

Когда браузер в ответ на свой вопрос получает какой-то объект данных, он в первую очередь ищет и смотрит на эту метку, чтобы понять, какие данные пришли и может ли браузер вообще их обработать. Вот и все, на самом деле ничего сложного. Давайте посмотрим на практике, как это происходит. Первым делом необходимо ознакомиться со всем списком утвержденных MIME-типов. Это можно сделать, например, на сайте Википедии. Есть общие типы, описывающие документ, и есть подтипы, чтобы более подробно определить нужный формат. Например: application/pdf , text/html , image/png . MIME-типы указываются в так называемом заголовке (HTTP header) — Content-Type.

favicon для сайта имеет MIME-тип

favicon для сайта имеет MIME-тип «image/png»

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *