diff options
Diffstat (limited to 'includes/file.inc')
-rw-r--r-- | includes/file.inc | 383 |
1 files changed, 28 insertions, 355 deletions
diff --git a/includes/file.inc b/includes/file.inc index a9ff49e9d..d649364c1 100644 --- a/includes/file.inc +++ b/includes/file.inc @@ -1520,366 +1520,39 @@ function file_upload_max_size() { * @param $filename * Name of the file, including extension. * @param $mapping - * An optional array of extension to media type mappings in the form - * 'extension1|extension2|...' => 'type'. + * An optional map of extensions to their mimetypes, in the form: + * - 'mimetypes': a list of mimetypes, keyed by an identifier, + * - 'extensions': the mapping itself, an associative array in which + * the key is the extension and the value is the mimetype identifier. * * @return * The internet media type registered for the extension or application/octet-stream for unknown extensions. */ function file_get_mimetype($filename, $mapping = NULL) { - if (!is_array($mapping)) { - $mapping = variable_get('mime_extension_mapping', array( - 'ez' => 'application/andrew-inset', - 'atom' => 'application/atom', - 'atomcat' => 'application/atomcat+xml', - 'atomsrv' => 'application/atomserv+xml', - 'cap|pcap' => 'application/cap', - 'cu' => 'application/cu-seeme', - 'tsp' => 'application/dsptype', - 'spl' => 'application/x-futuresplash', - 'hta' => 'application/hta', - 'jar' => 'application/java-archive', - 'ser' => 'application/java-serialized-object', - 'class' => 'application/java-vm', - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'image/x-corelphotopaint', - 'nb' => 'application/mathematica', - 'mdb' => 'application/msaccess', - 'doc|dot' => 'application/msword', - 'bin' => 'application/octet-stream', - 'oda' => 'application/oda', - 'ogg|ogx' => 'application/ogg', - 'pdf' => 'application/pdf', - 'key' => 'application/pgp-keys', - 'pgp' => 'application/pgp-signature', - 'prf' => 'application/pics-rules', - 'ps|ai|eps' => 'application/postscript', - 'rar' => 'application/rar', - 'rdf' => 'application/rdf+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'smi|smil' => 'application/smil', - 'wpd' => 'application/wordperfect', - 'wp5' => 'application/wordperfect5.1', - 'xhtml|xht' => 'application/xhtml+xml', - 'xml|xsl' => 'application/xml', - 'zip' => 'application/zip', - 'cdy' => 'application/vnd.cinderella', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xls|xlb|xlt' => 'application/vnd.ms-excel', - 'cat' => 'application/vnd.ms-pki.seccat', - 'stl' => 'application/vnd.ms-pki.stl', - 'ppt|pps' => 'application/vnd.ms-powerpoint', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'docm' => 'application/vnd.ms-word.document.macroEnabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'cod' => 'application/vnd.rim.cod', - 'mmf' => 'application/vnd.smaf', - 'sdc' => 'application/vnd.stardivision.calc', - 'sds' => 'application/vnd.stardivision.chart', - 'sda' => 'application/vnd.stardivision.draw', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdf' => 'application/vnd.stardivision.math', - 'sdw' => 'application/vnd.stardivision.writer', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sxc' => 'application/vnd.sun.xml.calc', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'sxd' => 'application/vnd.sun.xml.draw', - 'std' => 'application/vnd.sun.xml.draw.template', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sis' => 'application/vnd.symbian.install', - 'vsd' => 'application/vnd.visio', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wk' => 'application/x-123', - '7z' => 'application/x-7z-compressed', - 'abw' => 'application/x-abiword', - 'dmg' => 'application/x-apple-diskimage', - 'bcpio' => 'application/x-bcpio', - 'torrent' => 'application/x-bittorrent', - 'cab' => 'application/x-cab', - 'cbr' => 'application/x-cbr', - 'cbz' => 'application/x-cbz', - 'cdf' => 'application/x-cdf', - 'vcd' => 'application/x-cdlink', - 'pgn' => 'application/x-chess-pgn', - 'cpio' => 'application/x-cpio', - 'csh' => 'text/x-csh', - 'deb|udeb' => 'application/x-debian-package', - 'dcr|dir|dxr' => 'application/x-director', - 'dms' => 'application/x-dms', - 'wad' => 'application/x-doom', - 'dvi' => 'application/x-dvi', - 'rhtml' => 'application/x-httpd-eruby', - 'flac' => 'application/x-flac', - 'pfa|pfb|gsf|pcf|pcf.Z' => 'application/x-font', - 'mm' => 'application/x-freemind', - 'gnumeric' => 'application/x-gnumeric', - 'sgf' => 'application/x-go-sgf', - 'gcf' => 'application/x-graphing-calculator', - 'gtar|tgz|taz' => 'application/x-gtar', - 'hdf' => 'application/x-hdf', - 'phtml|pht|php' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'php3' => 'application/x-httpd-php3', - 'php3p' => 'application/x-httpd-php3-preprocessed', - 'php4' => 'application/x-httpd-php4', - 'ica' => 'application/x-ica', - 'ins|isp' => 'application/x-internet-signup', - 'iii' => 'application/x-iphone', - 'iso' => 'application/x-iso9660-image', - 'jnlp' => 'application/x-java-jnlp-file', - 'js' => 'application/x-javascript', - 'jmz' => 'application/x-jmol', - 'chrt' => 'application/x-kchart', - 'kil' => 'application/x-killustrator', - 'skp|skd|skt|skm' => 'application/x-koan', - 'kpr|kpt' => 'application/x-kpresenter', - 'ksp' => 'application/x-kspread', - 'kwd|kwt' => 'application/x-kword', - 'latex' => 'application/x-latex', - 'lha' => 'application/x-lha', - 'lyx' => 'application/x-lyx', - 'lzh' => 'application/x-lzh', - 'lzx' => 'application/x-lzx', - 'frm|maker|frame|fm|fb|book|fbdoc' => 'application/x-maker', - 'mif' => 'application/x-mif', - 'wmd' => 'application/x-ms-wmd', - 'wmz' => 'application/x-ms-wmz', - 'com|exe|bat|dll' => 'application/x-msdos-program', - 'msi' => 'application/x-msi', - 'nc' => 'application/x-netcdf', - 'pac' => 'application/x-ns-proxy-autoconfig', - 'nwc' => 'application/x-nwc', - 'o' => 'application/x-object', - 'oza' => 'application/x-oz-application', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'crl' => 'application/x-pkcs7-crl', - 'pyc|pyo' => 'application/x-python-code', - 'qtl' => 'application/x-quicktimeplayer', - 'rpm' => 'application/x-redhat-package-manager', - 'sh' => 'text/x-sh', - 'shar' => 'application/x-shar', - 'swf|swfl' => 'application/x-shockwave-flash', - 'sit|sitx' => 'application/x-stuffit', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'tar' => 'application/x-tar', - 'tcl' => 'application/x-tcl', - 'gf' => 'application/x-tex-gf', - 'pk' => 'application/x-tex-pk', - 'texinfo|texi' => 'application/x-texinfo', - '~|%|bak|old|sik' => 'application/x-trash', - 't|tr|roff' => 'application/x-troff', - 'man' => 'application/x-troff-man', - 'me' => 'application/x-troff-me', - 'ms' => 'application/x-troff-ms', - 'ustar' => 'application/x-ustar', - 'src' => 'application/x-wais-source', - 'wz' => 'application/x-wingz', - 'crt' => 'application/x-x509-ca-cert', - 'xcf' => 'application/x-xcf', - 'fig' => 'application/x-xfig', - 'xpi' => 'application/x-xpinstall', - 'au|snd' => 'audio/basic', - 'mid|midi|kar' => 'audio/midi', - 'mpga|mpega|mp2|mp3|m4a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'oga|spx' => 'audio/ogg', - 'sid' => 'audio/prs.sid', - 'aif|aiff|aifc' => 'audio/x-aiff', - 'gsm' => 'audio/x-gsm', - 'wma' => 'audio/x-ms-wma', - 'wax' => 'audio/x-ms-wax', - 'ra|rm|ram' => 'audio/x-pn-realaudio', - 'ra' => 'audio/x-realaudio', - 'pls' => 'audio/x-scpls', - 'sd2' => 'audio/x-sd2', - 'wav' => 'audio/x-wav', - 'alc' => 'chemical/x-alchemy', - 'cac|cache' => 'chemical/x-cache', - 'csf' => 'chemical/x-cache-csf', - 'cbin|cascii|ctab' => 'chemical/x-cactvs-binary', - 'cdx' => 'chemical/x-cdx', - 'cer' => 'chemical/x-cerius', - 'c3d' => 'chemical/x-chem3d', - 'chm' => 'chemical/x-chemdraw', - 'cif' => 'chemical/x-cif', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cpa' => 'chemical/x-compass', - 'bsd' => 'chemical/x-crossfire', - 'csml|csm' => 'chemical/x-csml', - 'ctx' => 'chemical/x-ctx', - 'cxf|cef' => 'chemical/x-cxf', - 'emb|embl' => 'chemical/x-embl-dl-nucleotide', - 'spc' => 'chemical/x-galactic-spc', - 'inp|gam|gamin' => 'chemical/x-gamess-input', - 'fch|fchk' => 'chemical/x-gaussian-checkpoint', - 'cub' => 'chemical/x-gaussian-cube', - 'gau|gjc|gjf' => 'chemical/x-gaussian-input', - 'gal' => 'chemical/x-gaussian-log', - 'gcg' => 'chemical/x-gcg8-sequence', - 'gen' => 'chemical/x-genbank', - 'hin' => 'chemical/x-hin', - 'istr|ist' => 'chemical/x-isostar', - 'jdx|dx' => 'chemical/x-jcamp-dx', - 'kin' => 'chemical/x-kinemage', - 'mcm' => 'chemical/x-macmolecule', - 'mmd|mmod' => 'chemical/x-macromodel-input', - 'mol' => 'chemical/x-mdl-molfile', - 'rd' => 'chemical/x-mdl-rdfile', - 'rxn' => 'chemical/x-mdl-rxnfile', - 'sd|sdf' => 'chemical/x-mdl-sdfile', - 'tgf' => 'chemical/x-mdl-tgf', - 'mcif' => 'chemical/x-mmcif', - 'mol2' => 'chemical/x-mol2', - 'b' => 'chemical/x-molconn-Z', - 'gpt' => 'chemical/x-mopac-graph', - 'mop|mopcrt|mpc|dat|zmt' => 'chemical/x-mopac-input', - 'moo' => 'chemical/x-mopac-out', - 'mvb' => 'chemical/x-mopac-vib', - 'asn' => 'chemical/x-ncbi-asn1-spec', - 'prt|ent' => 'chemical/x-ncbi-asn1-ascii', - 'val|aso' => 'chemical/x-ncbi-asn1-binary', - 'pdb|ent' => 'chemical/x-pdb', - 'ros' => 'chemical/x-rosdal', - 'sw' => 'chemical/x-swissprot', - 'vms' => 'chemical/x-vamas-iso14976', - 'vmd' => 'chemical/x-vmd', - 'xtel' => 'chemical/x-xtel', - 'xyz' => 'chemical/x-xyz', - 'gif' => 'image/gif', - 'ief' => 'image/ief', - 'jpeg|jpg|jpe' => 'image/jpeg', - 'pcx' => 'image/pcx', - 'png' => 'image/png', - 'svg|svgz' => 'image/svg+xml', - 'tiff|tif' => 'image/tiff', - 'djvu|djv' => 'image/vnd.djvu', - 'wbmp' => 'image/vnd.wap.wbmp', - 'ras' => 'image/x-cmu-raster', - 'cdr' => 'image/x-coreldraw', - 'pat' => 'image/x-coreldrawpattern', - 'cdt' => 'image/x-coreldrawtemplate', - 'ico' => 'image/vnd.microsoft.icon', - 'art' => 'image/x-jg', - 'jng' => 'image/x-jng', - 'bmp' => 'image/x-ms-bmp', - 'psd' => 'image/x-photoshop', - 'pnm' => 'image/x-portable-anymap', - 'pbm' => 'image/x-portable-bitmap', - 'pgm' => 'image/x-portable-graymap', - 'ppm' => 'image/x-portable-pixmap', - 'rgb' => 'image/x-rgb', - 'xbm' => 'image/x-xbitmap', - 'xpm' => 'image/x-xpixmap', - 'xwd' => 'image/x-xwindowdump', - 'eml' => 'message/rfc822', - 'igs|iges' => 'model/iges', - 'msh|mesh|silo' => 'model/mesh', - 'wrl|vrml' => 'model/vrml', - 'ics|icz' => 'text/calendar', - 'css' => 'text/css', - 'csv' => 'text/csv', - '323' => 'text/h323', - 'html|htm|shtml' => 'text/html', - 'uls' => 'text/iuls', - 'mml' => 'text/mathml', - 'asc|txt|text|pot' => 'text/plain', - 'rtx' => 'text/richtext', - 'sct|wsc' => 'text/scriptlet', - 'tm|ts' => 'text/texmacs', - 'tsv' => 'text/tab-separated-values', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'wml' => 'text/vnd.wap.wml', - 'wmls' => 'text/vnd.wap.wmlscript', - 'bib' => 'text/x-bibtex', - 'boo' => 'text/x-boo', - 'h++|hpp|hxx|hh' => 'text/x-c++hdr', - 'c++|cpp|cxx|cc' => 'text/x-c++src', - 'h' => 'text/x-chdr', - 'htc' => 'text/x-component', - 'c' => 'text/x-csrc', - 'd' => 'text/x-dsrc', - 'diff|patch' => 'text/x-diff', - 'hs' => 'text/x-haskell', - 'java' => 'text/x-java', - 'lhs' => 'text/x-literate-haskell', - 'moc' => 'text/x-moc', - 'p|pas' => 'text/x-pascal', - 'gcd' => 'text/x-pcs-gcd', - 'pl|pm' => 'text/x-perl', - 'py' => 'text/x-python', - 'etx' => 'text/x-setext', - 'tcl|tk' => 'text/x-tcl', - 'tex|ltx|sty|cls' => 'text/x-tex', - 'vcs' => 'text/x-vcalendar', - 'vcf' => 'text/x-vcard', - '3gp' => 'video/3gpp', - 'dl' => 'video/dl', - 'dif|dv' => 'video/dv', - 'fli' => 'video/fli', - 'gl' => 'video/gl', - 'mpeg|mpg|mpe' => 'video/mpeg', - 'mp4' => 'video/mp4', - 'ogv' => 'video/ogg', - 'qt|mov' => 'video/quicktime', - 'mxu' => 'video/vnd.mpegurl', - 'lsf|lsx' => 'video/x-la-asf', - 'mng' => 'video/x-mng', - 'asf|asx' => 'video/x-ms-asf', - 'wm' => 'video/x-ms-wm', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wvx' => 'video/x-ms-wvx', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie', - 'ice' => 'x-conference/x-cooltalk', - 'sisx' => 'x-epoc/x-sisx-app', - 'vrm|vrml|wrl' => 'x-world/x-vrml', - 'xps' => 'application/vnd.ms-xpsdocument', - )); - } - foreach ($mapping as $ext_preg => $mime_match) { - if (preg_match('!\.(' . $ext_preg . ')$!i', $filename)) { - return $mime_match; + if (!isset($mapping)) { + $mapping = variable_get('mime_extension_mapping', NULL); + if (!isset($mapping) && drupal_function_exists('file_default_mimetype_mapping')) { + // The default file map, defined in file.mimetypes.inc is quite big. + // We only load it when necessary. + $mapping = file_default_mimetype_mapping(); + } + } + + $extension = ''; + $file_parts = explode('.', $filename); + + // Remove the first part: a full filename should not match an extension. + array_shift($file_parts); + + // Iterate over the file parts, trying to find a match. + // For my.awesome.image.jpeg, we try: + // - jpeg + // - image.jpeg, and + // - awesome.image.jpeg + while ($additional_part = array_pop($file_parts)) { + $extension = $additional_part . ($extension ? '.' . $extension : ''); + if (isset($mapping['extensions'][$extension])) { + return $mapping['mimetypes'][$mapping['extensions'][$extension]]; } } |