3 namespace Drupal\Core\File\MimeType;
5 use Drupal\Core\Extension\ModuleHandlerInterface;
6 use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface;
9 * Makes possible to guess the MIME type of a file using its extension.
11 class ExtensionMimeTypeGuesser implements MimeTypeGuesserInterface {
14 * Default MIME extension mapping.
17 * Array of mimetypes correlated to the extensions that relate to them.
19 protected $defaultMapping = [
21 0 => 'application/andrew-inset',
22 1 => 'application/atom',
23 2 => 'application/atomcat+xml',
24 3 => 'application/atomserv+xml',
25 4 => 'application/cap',
26 5 => 'application/cu-seeme',
27 6 => 'application/dsptype',
28 350 => 'application/epub+zip',
29 7 => 'application/hta',
30 8 => 'application/java-archive',
31 9 => 'application/java-serialized-object',
32 10 => 'application/java-vm',
33 11 => 'application/mac-binhex40',
34 12 => 'application/mathematica',
35 13 => 'application/msaccess',
36 14 => 'application/msword',
37 15 => 'application/octet-stream',
38 16 => 'application/oda',
39 17 => 'application/ogg',
40 18 => 'application/pdf',
41 19 => 'application/pgp-keys',
42 20 => 'application/pgp-signature',
43 21 => 'application/pics-rules',
44 22 => 'application/postscript',
45 23 => 'application/rar',
46 24 => 'application/rdf+xml',
47 25 => 'application/rss+xml',
48 26 => 'application/rtf',
49 27 => 'application/smil',
50 349 => 'application/vnd.amazon.ebook',
51 28 => 'application/vnd.cinderella',
52 29 => 'application/vnd.google-earth.kml+xml',
53 30 => 'application/vnd.google-earth.kmz',
54 31 => 'application/vnd.mozilla.xul+xml',
55 32 => 'application/vnd.ms-excel',
56 33 => 'application/vnd.ms-excel.addin.macroEnabled.12',
57 34 => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
58 35 => 'application/vnd.ms-excel.sheet.macroEnabled.12',
59 36 => 'application/vnd.ms-excel.template.macroEnabled.12',
60 37 => 'application/vnd.ms-pki.seccat',
61 38 => 'application/vnd.ms-pki.stl',
62 39 => 'application/vnd.ms-powerpoint',
63 40 => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
64 41 => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
65 42 => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
66 43 => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
67 44 => 'application/vnd.ms-word.document.macroEnabled.12',
68 45 => 'application/vnd.ms-word.template.macroEnabled.12',
69 46 => 'application/vnd.ms-xpsdocument',
70 47 => 'application/vnd.oasis.opendocument.chart',
71 48 => 'application/vnd.oasis.opendocument.database',
72 49 => 'application/vnd.oasis.opendocument.formula',
73 50 => 'application/vnd.oasis.opendocument.graphics',
74 51 => 'application/vnd.oasis.opendocument.graphics-template',
75 52 => 'application/vnd.oasis.opendocument.image',
76 53 => 'application/vnd.oasis.opendocument.presentation',
77 54 => 'application/vnd.oasis.opendocument.presentation-template',
78 55 => 'application/vnd.oasis.opendocument.spreadsheet',
79 56 => 'application/vnd.oasis.opendocument.spreadsheet-template',
80 57 => 'application/vnd.oasis.opendocument.text',
81 58 => 'application/vnd.oasis.opendocument.text-master',
82 59 => 'application/vnd.oasis.opendocument.text-template',
83 60 => 'application/vnd.oasis.opendocument.text-web',
84 61 => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
85 62 => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
86 63 => 'application/vnd.openxmlformats-officedocument.presentationml.template',
87 64 => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
88 65 => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
89 66 => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
90 67 => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
91 68 => 'application/vnd.rim.cod',
92 69 => 'application/vnd.smaf',
93 70 => 'application/vnd.stardivision.calc',
94 71 => 'application/vnd.stardivision.chart',
95 72 => 'application/vnd.stardivision.draw',
96 73 => 'application/vnd.stardivision.impress',
97 74 => 'application/vnd.stardivision.math',
98 75 => 'application/vnd.stardivision.writer',
99 76 => 'application/vnd.stardivision.writer-global',
100 77 => 'application/vnd.sun.xml.calc',
101 78 => 'application/vnd.sun.xml.calc.template',
102 79 => 'application/vnd.sun.xml.draw',
103 80 => 'application/vnd.sun.xml.draw.template',
104 81 => 'application/vnd.sun.xml.impress',
105 82 => 'application/vnd.sun.xml.impress.template',
106 83 => 'application/vnd.sun.xml.math',
107 84 => 'application/vnd.sun.xml.writer',
108 85 => 'application/vnd.sun.xml.writer.global',
109 86 => 'application/vnd.sun.xml.writer.template',
110 87 => 'application/vnd.symbian.install',
111 88 => 'application/vnd.visio',
112 89 => 'application/vnd.wap.wbxml',
113 90 => 'application/vnd.wap.wmlc',
114 91 => 'application/vnd.wap.wmlscriptc',
115 92 => 'application/wordperfect',
116 93 => 'application/wordperfect5.1',
117 94 => 'application/x-123',
118 95 => 'application/x-7z-compressed',
119 96 => 'application/x-abiword',
120 97 => 'application/x-apple-diskimage',
121 98 => 'application/x-bcpio',
122 99 => 'application/x-bittorrent',
123 100 => 'application/x-cab',
124 101 => 'application/x-cbr',
125 102 => 'application/x-cbz',
126 103 => 'application/x-cdf',
127 104 => 'application/x-cdlink',
128 105 => 'application/x-chess-pgn',
129 106 => 'application/x-cpio',
130 107 => 'application/x-debian-package',
131 108 => 'application/x-director',
132 109 => 'application/x-dms',
133 110 => 'application/x-doom',
134 111 => 'application/x-dvi',
135 112 => 'application/x-flac',
136 113 => 'application/x-font',
137 114 => 'application/x-freemind',
138 115 => 'application/x-futuresplash',
139 116 => 'application/x-gnumeric',
140 117 => 'application/x-go-sgf',
141 118 => 'application/x-graphing-calculator',
142 119 => 'application/x-gtar',
143 120 => 'application/x-hdf',
144 121 => 'application/x-httpd-eruby',
145 122 => 'application/x-httpd-php',
146 123 => 'application/x-httpd-php-source',
147 124 => 'application/x-httpd-php3',
148 125 => 'application/x-httpd-php3-preprocessed',
149 126 => 'application/x-httpd-php4',
150 127 => 'application/x-ica',
151 128 => 'application/x-internet-signup',
152 129 => 'application/x-iphone',
153 130 => 'application/x-iso9660-image',
154 131 => 'application/x-java-jnlp-file',
155 132 => 'application/javascript',
156 133 => 'application/x-jmol',
157 134 => 'application/x-kchart',
158 135 => 'application/x-killustrator',
159 136 => 'application/x-koan',
160 137 => 'application/x-kpresenter',
161 138 => 'application/x-kspread',
162 139 => 'application/x-kword',
163 140 => 'application/x-latex',
164 141 => 'application/x-lha',
165 142 => 'application/x-lyx',
166 143 => 'application/x-lzh',
167 144 => 'application/x-lzx',
168 145 => 'application/x-maker',
169 146 => 'application/x-mif',
170 351 => 'application/x-mobipocket-ebook',
171 352 => 'application/x-mobipocket-ebook',
172 147 => 'application/x-ms-wmd',
173 148 => 'application/x-ms-wmz',
174 149 => 'application/x-msdos-program',
175 150 => 'application/x-msi',
176 151 => 'application/x-netcdf',
177 152 => 'application/x-ns-proxy-autoconfig',
178 153 => 'application/x-nwc',
179 154 => 'application/x-object',
180 155 => 'application/x-oz-application',
181 156 => 'application/x-pkcs7-certreqresp',
182 157 => 'application/x-pkcs7-crl',
183 158 => 'application/x-python-code',
184 159 => 'application/x-quicktimeplayer',
185 160 => 'application/x-redhat-package-manager',
186 161 => 'application/x-shar',
187 162 => 'application/x-shockwave-flash',
188 163 => 'application/x-stuffit',
189 164 => 'application/x-sv4cpio',
190 165 => 'application/x-sv4crc',
191 166 => 'application/x-tar',
192 167 => 'application/x-tcl',
193 168 => 'application/x-tex-gf',
194 169 => 'application/x-tex-pk',
195 170 => 'application/x-texinfo',
196 171 => 'application/x-trash',
197 172 => 'application/x-troff',
198 173 => 'application/x-troff-man',
199 174 => 'application/x-troff-me',
200 175 => 'application/x-troff-ms',
201 176 => 'application/x-ustar',
202 177 => 'application/x-wais-source',
203 178 => 'application/x-wingz',
204 179 => 'application/x-x509-ca-cert',
205 180 => 'application/x-xcf',
206 181 => 'application/x-xfig',
207 182 => 'application/x-xpinstall',
208 183 => 'application/xhtml+xml',
209 184 => 'application/xml',
210 185 => 'application/zip',
211 186 => 'audio/basic',
216 190 => 'audio/prs.sid',
218 191 => 'audio/x-aiff',
219 192 => 'audio/x-gsm',
220 354 => 'audio/x-matroska',
221 193 => 'audio/x-mpegurl',
222 194 => 'audio/x-ms-wax',
223 195 => 'audio/x-ms-wma',
224 196 => 'audio/x-pn-realaudio',
225 197 => 'audio/x-realaudio',
226 198 => 'audio/x-scpls',
227 199 => 'audio/x-sd2',
228 200 => 'audio/x-wav',
229 201 => 'chemical/x-alchemy',
230 202 => 'chemical/x-cache',
231 203 => 'chemical/x-cache-csf',
232 204 => 'chemical/x-cactvs-binary',
233 205 => 'chemical/x-cdx',
234 206 => 'chemical/x-cerius',
235 207 => 'chemical/x-chem3d',
236 208 => 'chemical/x-chemdraw',
237 209 => 'chemical/x-cif',
238 210 => 'chemical/x-cmdf',
239 211 => 'chemical/x-cml',
240 212 => 'chemical/x-compass',
241 213 => 'chemical/x-crossfire',
242 214 => 'chemical/x-csml',
243 215 => 'chemical/x-ctx',
244 216 => 'chemical/x-cxf',
245 217 => 'chemical/x-embl-dl-nucleotide',
246 218 => 'chemical/x-galactic-spc',
247 219 => 'chemical/x-gamess-input',
248 220 => 'chemical/x-gaussian-checkpoint',
249 221 => 'chemical/x-gaussian-cube',
250 222 => 'chemical/x-gaussian-input',
251 223 => 'chemical/x-gaussian-log',
252 224 => 'chemical/x-gcg8-sequence',
253 225 => 'chemical/x-genbank',
254 226 => 'chemical/x-hin',
255 227 => 'chemical/x-isostar',
256 228 => 'chemical/x-jcamp-dx',
257 229 => 'chemical/x-kinemage',
258 230 => 'chemical/x-macmolecule',
259 231 => 'chemical/x-macromodel-input',
260 232 => 'chemical/x-mdl-molfile',
261 233 => 'chemical/x-mdl-rdfile',
262 234 => 'chemical/x-mdl-rxnfile',
263 235 => 'chemical/x-mdl-sdfile',
264 236 => 'chemical/x-mdl-tgf',
265 237 => 'chemical/x-mmcif',
266 238 => 'chemical/x-mol2',
267 239 => 'chemical/x-molconn-Z',
268 240 => 'chemical/x-mopac-graph',
269 241 => 'chemical/x-mopac-input',
270 242 => 'chemical/x-mopac-out',
271 243 => 'chemical/x-mopac-vib',
272 244 => 'chemical/x-ncbi-asn1-ascii',
273 245 => 'chemical/x-ncbi-asn1-binary',
274 246 => 'chemical/x-ncbi-asn1-spec',
275 247 => 'chemical/x-pdb',
276 248 => 'chemical/x-rosdal',
277 249 => 'chemical/x-swissprot',
278 250 => 'chemical/x-vamas-iso14976',
279 251 => 'chemical/x-vmd',
280 252 => 'chemical/x-xtel',
281 253 => 'chemical/x-xyz',
287 259 => 'image/svg+xml',
289 261 => 'image/vnd.djvu',
290 262 => 'image/vnd.microsoft.icon',
291 263 => 'image/vnd.wap.wbmp',
293 264 => 'image/x-cmu-raster',
294 265 => 'image/x-coreldraw',
295 266 => 'image/x-coreldrawpattern',
296 267 => 'image/x-coreldrawtemplate',
297 268 => 'image/x-corelphotopaint',
299 270 => 'image/x-jng',
300 271 => 'image/x-ms-bmp',
301 272 => 'image/x-photoshop',
302 273 => 'image/x-portable-anymap',
303 274 => 'image/x-portable-bitmap',
304 275 => 'image/x-portable-graymap',
305 276 => 'image/x-portable-pixmap',
306 277 => 'image/x-rgb',
307 278 => 'image/x-xbitmap',
308 279 => 'image/x-xpixmap',
309 280 => 'image/x-xwindowdump',
310 281 => 'message/rfc822',
314 285 => 'text/calendar',
320 291 => 'text/mathml',
322 293 => 'text/richtext',
323 294 => 'text/scriptlet',
324 295 => 'text/tab-separated-values',
325 296 => 'text/texmacs',
326 297 => 'text/vnd.sun.j2me.app-descriptor',
327 298 => 'text/vnd.wap.wml',
328 299 => 'text/vnd.wap.wmlscript',
330 300 => 'text/x-bibtex',
332 302 => 'text/x-c++hdr',
333 303 => 'text/x-c++src',
334 304 => 'text/x-chdr',
335 305 => 'text/x-component',
337 307 => 'text/x-csrc',
338 308 => 'text/x-diff',
339 309 => 'text/x-dsrc',
340 310 => 'text/x-haskell',
341 311 => 'text/x-java',
342 312 => 'text/x-literate-haskell',
344 314 => 'text/x-pascal',
345 315 => 'text/x-pcs-gcd',
346 316 => 'text/x-perl',
347 317 => 'text/x-python',
348 318 => 'text/x-setext',
352 322 => 'text/x-vcalendar',
353 323 => 'text/x-vcard',
362 332 => 'video/quicktime',
363 333 => 'video/vnd.mpegurl',
365 347 => 'video/x-flv',
366 334 => 'video/x-la-asf',
367 348 => 'video/x-m4v',
368 353 => 'video/x-matroska',
369 335 => 'video/x-mng',
370 336 => 'video/x-ms-asf',
371 337 => 'video/x-ms-wm',
372 338 => 'video/x-ms-wmv',
373 339 => 'video/x-ms-wmx',
374 340 => 'video/x-ms-wvx',
375 341 => 'video/x-msvideo',
376 342 => 'video/x-sgi-movie',
377 343 => 'x-conference/x-cooltalk',
378 344 => 'x-epoc/x-sisx-app',
379 345 => 'x-world/x-vrml',
382 // Extensions added to this list MUST be lower-case.
863 * The MIME types mapping array after going through the module handler.
870 * The module handler.
872 * @var \Drupal\Core\Extension\ModuleHandlerInterface
874 protected $moduleHandler;
877 * Constructs a new ExtensionMimeTypeGuesser.
879 * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
880 * The module handler.
882 public function __construct(ModuleHandlerInterface $module_handler) {
883 $this->moduleHandler = $module_handler;
889 public function guess($path) {
890 if ($this->mapping === NULL) {
891 $mapping = $this->defaultMapping;
892 // Allow modules to alter the default mapping.
893 $this->moduleHandler->alter('file_mimetype_mapping', $mapping);
894 $this->mapping = $mapping;
898 $file_parts = explode('.', drupal_basename($path));
900 // Remove the first part: a full filename should not match an extension.
901 array_shift($file_parts);
903 // Iterate over the file parts, trying to find a match.
904 // For my.awesome.image.jpeg, we try:
907 // - awesome.image.jpeg
908 while ($additional_part = array_pop($file_parts)) {
909 $extension = strtolower($additional_part . ($extension ? '.' . $extension : ''));
910 if (isset($this->mapping['extensions'][$extension])) {
911 return $this->mapping['mimetypes'][$this->mapping['extensions'][$extension]];
915 return 'application/octet-stream';
919 * Sets the mimetypes/extension mapping to use when guessing mimetype.
921 * @param array|null $mapping
922 * Passing a NULL mapping will cause guess() to use self::$defaultMapping.
924 public function setMapping(array $mapping = NULL) {
925 $this->mapping = $mapping;