euromark 13 years ago
parent
commit
fc182699d7
2 changed files with 922 additions and 0 deletions
  1. 833 0
      Lib/MimeLib.php
  2. 89 0
      Test/Case/Lib/MimeLibTest.php

+ 833 - 0
Lib/MimeLib.php

@@ -0,0 +1,833 @@
+<?php
+
+App::uses('CakeResponse', 'Network');
+
+/**
+ * Wrapper to be able to read cake core's mime types as well as fix for missing ones
+ *
+ * @version 1.0
+ * @license MIT
+ * @author	Mark Scherer
+ */
+class MimeLib extends CakeResponse {
+
+	protected $_mimeTypesExt = array(
+		'3dm' => 'x-world/x-3dmf',
+		'3dmf' => 'x-world/x-3dmf',
+		'a' => 'application/octet-stream',
+		'aab' => 'application/x-authorware-bin',
+		'aam' => 'application/x-authorware-map',
+		'aas' => 'application/x-authorware-seg',
+		'abc' => 'text/vnd.abc',
+		'acgi' => 'text/html',
+		'afl' => 'video/animaflex',
+		'ai' => 'application/postscript',
+		'aif' => 'audio/aiff',
+		'aif' => 'audio/x-aiff',
+		'aifc' => 'audio/aiff',
+		'aifc' => 'audio/x-aiff',
+		'aiff' => 'audio/aiff',
+		'aiff' => 'audio/x-aiff',
+		'aim' => 'application/x-aim',
+		'aip' => 'text/x-audiosoft-intra',
+		'ani' => 'application/x-navi-animation',
+		'aos' => 'application/x-nokia-9000-communicator-add-on-software',
+		'aps' => 'application/mime',
+		'arc' => 'application/octet-stream',
+		'arj' => 'application/arj',
+		'arj' => 'application/octet-stream',
+		'art' => 'image/x-jg',
+		'asf' => 'video/x-ms-asf',
+		'asm' => 'text/x-asm',
+		'asp' => 'text/asp',
+		'asx' => 'application/x-mplayer2',
+		'asx' => 'video/x-ms-asf',
+		'asx' => 'video/x-ms-asf-plugin',
+		'au' => 'audio/basic',
+		'au' => 'audio/x-au',
+		'avi' => 'application/x-troff-msvideo',
+		'avi' => 'video/avi',
+		'avi' => 'video/msvideo',
+		'avi' => 'video/x-msvideo',
+		'avs' => 'video/avs-video',
+		'bcpio' => 'application/x-bcpio',
+		'bin' => 'application/mac-binary',
+		'bin' => 'application/macbinary',
+		'bin' => 'application/octet-stream',
+		'bin' => 'application/x-binary',
+		'bin' => 'application/x-macbinary',
+		'bm' => 'image/bmp',
+		'bmp' => 'image/bmp',
+		'bmp' => 'image/x-windows-bmp',
+		'boo' => 'application/book',
+		'book' => 'application/book',
+		'boz' => 'application/x-bzip2',
+		'bsh' => 'application/x-bsh',
+		'bz' => 'application/x-bzip',
+		'bz2' => 'application/x-bzip2',
+		'c' => 'text/plain',
+		'c' => 'text/x-c',
+		'c++' => 'text/plain',
+		'cat' => 'application/vnd.ms-pki.seccat',
+		'cc' => 'text/plain',
+		'cc' => 'text/x-c',
+		'ccad' => 'application/clariscad',
+		'cco' => 'application/x-cocoa',
+		'cdf' => 'application/cdf',
+		'cdf' => 'application/x-cdf',
+		'cdf' => 'application/x-netcdf',
+		'cer' => 'application/pkix-cert',
+		'cer' => 'application/x-x509-ca-cert',
+		'cha' => 'application/x-chat',
+		'chat' => 'application/x-chat',
+		'class' => 'application/java',
+		'class' => 'application/java-byte-code',
+		'class' => 'application/x-java-class',
+		'com' => 'application/octet-stream',
+		'com' => 'text/plain',
+		'conf' => 'text/plain',
+		'cpio' => 'application/x-cpio',
+		'cpp' => 'text/x-c',
+		'cpt' => 'application/mac-compactpro',
+		'cpt' => 'application/x-compactpro',
+		'cpt' => 'application/x-cpt',
+		'crl' => 'application/pkcs-crl',
+		'crl' => 'application/pkix-crl',
+		'crt' => 'application/pkix-cert',
+		'crt' => 'application/x-x509-ca-cert',
+		'crt' => 'application/x-x509-user-cert',
+		'csh' => 'application/x-csh',
+		'csh' => 'text/x-script.csh',
+		'css' => 'application/x-pointplus',
+		'css' => 'text/css',
+		'cxx' => 'text/plain',
+		'dcr' => 'application/x-director',
+		'deepv' => 'application/x-deepv',
+		'def' => 'text/plain',
+		'der' => 'application/x-x509-ca-cert',
+		'dif' => 'video/x-dv',
+		'dir' => 'application/x-director',
+		'dl' => 'video/dl',
+		'dl' => 'video/x-dl',
+		'doc' => 'application/msword',
+		'dot' => 'application/msword',
+		'dp' => 'application/commonground',
+		'drw' => 'application/drafting',
+		'dump' => 'application/octet-stream',
+		'dv' => 'video/x-dv',
+		'dvi' => 'application/x-dvi',
+		'dwf' => 'model/vnd.dwf',
+		'dwg' => 'application/acad',
+		'dwg' => 'image/vnd.dwg',
+		'dwg' => 'image/x-dwg',
+		'dxf' => 'application/dxf',
+		'dxf' => 'image/vnd.dwg',
+		'dxf' => 'image/x-dwg',
+		'dxr' => 'application/x-director',
+		'el' => 'text/x-script.elisp',
+		'elc' => 'application/x-bytecode.elisp',
+		'elc' => 'application/x-elc',
+		'env' => 'application/x-envoy',
+		'eps' => 'application/postscript',
+		'es' => 'application/x-esrehber',
+		'etx' => 'text/x-setext',
+		'evy' => 'application/envoy',
+		'evy' => 'application/x-envoy',
+		'exe' => 'application/octet-stream',
+		'f' => 'text/plain',
+		'f' => 'text/x-fortran',
+		'f77' => 'text/x-fortran',
+		'f90' => 'text/plain',
+		'f90' => 'text/x-fortran',
+		'fdf' => 'application/vnd.fdf',
+		'fif' => 'application/fractals',
+		'fif' => 'image/fif',
+		'fli' => 'video/fli',
+		'fli' => 'video/x-fli',
+		'flo' => 'image/florian',
+		'flx' => 'text/vnd.fmi.flexstor',
+		'fmf' => 'video/x-atomic3d-feature',
+		'for' => 'text/plain',
+		'for' => 'text/x-fortran',
+		'fpx' => 'image/vnd.fpx',
+		'fpx' => 'image/vnd.net-fpx',
+		'frl' => 'application/freeloader',
+		'funk' => 'audio/make',
+		'g' => 'text/plain',
+		'g3' => 'image/g3fax',
+		'gif' => 'image/gif',
+		'gl' => 'video/gl',
+		'gl' => 'video/x-gl',
+		'gsd' => 'audio/x-gsm',
+		'gsm' => 'audio/x-gsm',
+		'gsp' => 'application/x-gsp',
+		'gss' => 'application/x-gss',
+		'gtar' => 'application/x-gtar',
+		'gz' => 'application/x-compressed',
+		'gz' => 'application/x-gzip',
+		'gzip' => 'application/x-gzip',
+		'gzip' => 'multipart/x-gzip',
+		'h' => 'text/plain',
+		'h' => 'text/x-h',
+		'hdf' => 'application/x-hdf',
+		'help' => 'application/x-helpfile',
+		'hgl' => 'application/vnd.hp-hpgl',
+		'hh' => 'text/plain',
+		'hh' => 'text/x-h',
+		'hlb' => 'text/x-script',
+		'hlp' => 'application/hlp',
+		'hlp' => 'application/x-helpfile',
+		'hlp' => 'application/x-winhelp',
+		'hpg' => 'application/vnd.hp-hpgl',
+		'hpgl' => 'application/vnd.hp-hpgl',
+		'hqx' => 'application/binhex',
+		'hqx' => 'application/binhex4',
+		'hqx' => 'application/mac-binhex',
+		'hqx' => 'application/mac-binhex40',
+		'hqx' => 'application/x-binhex40',
+		'hqx' => 'application/x-mac-binhex40',
+		'hta' => 'application/hta',
+		'htc' => 'text/x-component',
+		'htm' => 'text/html',
+		'html' => 'text/html',
+		'htmls' => 'text/html',
+		'htt' => 'text/webviewhtml',
+		'htx' => 'text/html',
+		'ice' => 'x-conference/x-cooltalk',
+		'ico' => 'image/x-icon',
+		'ics' => 'text/calendar',
+		'ical' => 'text/calendar',
+		'idc' => 'text/plain',
+		'ief' => 'image/ief',
+		'iefs' => 'image/ief',
+		'ifb' => 'text/calendar',
+		'iges' => 'application/iges',
+		'iges' => 'model/iges',
+		'igs' => 'application/iges',
+		'igs' => 'model/iges',
+		'ima' => 'application/x-ima',
+		'imap' => 'application/x-httpd-imap',
+		'inf' => 'application/inf',
+		'ins' => 'application/x-internett-signup',
+		'ip' => 'application/x-ip2',
+		'isu' => 'video/x-isvideo',
+		'it' => 'audio/it',
+		'iv' => 'application/x-inventor',
+		'ivr' => 'i-world/i-vrml',
+		'ivy' => 'application/x-livescreen',
+		'jam' => 'audio/x-jam',
+		'jav' => 'text/plain',
+		'jav' => 'text/x-java-source',
+		'java' => 'text/plain',
+		'java' => 'text/x-java-source',
+		'jcm' => 'application/x-java-commerce',
+		'jfif' => 'image/jpeg',
+		'jfif' => 'image/pjpeg',
+		'jfif-tbnl' => 'image/jpeg',
+		'jpe' => 'image/jpeg',
+		'jpe' => 'image/pjpeg',
+		'jpeg' => 'image/jpeg',
+		'jpeg' => 'image/pjpeg',
+		'jpg' => 'image/jpeg',
+		'jpg' => 'image/pjpeg',
+		'jps' => 'image/x-jps',
+		'js' => 'text/javascript',
+		'jut' => 'image/jutvision',
+		'kar' => 'audio/midi',
+		'kar' => 'music/x-karaoke',
+		'ksh' => 'application/x-ksh',
+		'ksh' => 'text/x-script.ksh',
+		'la' => 'audio/nspaudio',
+		'la' => 'audio/x-nspaudio',
+		'lam' => 'audio/x-liveaudio',
+		'latex' => 'application/x-latex',
+		'lha' => 'application/lha',
+		'lha' => 'application/octet-stream',
+		'lha' => 'application/x-lha',
+		'lhx' => 'application/octet-stream',
+		'list' => 'text/plain',
+		'lma' => 'audio/nspaudio',
+		'lma' => 'audio/x-nspaudio',
+		'log' => 'text/plain',
+		'lsp' => 'application/x-lisp',
+		'lsp' => 'text/x-script.lisp',
+		'lst' => 'text/plain',
+		'lsx' => 'text/x-la-asf',
+		'ltx' => 'application/x-latex',
+		'lzh' => 'application/octet-stream',
+		'lzh' => 'application/x-lzh',
+		'lzx' => 'application/lzx',
+		'lzx' => 'application/octet-stream',
+		'lzx' => 'application/x-lzx',
+		'm' => 'text/plain',
+		'm' => 'text/x-m',
+		'm1v' => 'video/mpeg',
+		'm2a' => 'audio/mpeg',
+		'm2v' => 'video/mpeg',
+		'm3u' => 'audio/x-mpequrl',
+		'man' => 'application/x-troff-man',
+		'map' => 'application/x-navimap',
+		'mar' => 'text/plain',
+		'mbd' => 'application/mbedlet',
+		'mc$' => 'application/x-magic-cap-package-1.0',
+		'mcd' => 'application/mcad',
+		'mcd' => 'application/x-mathcad',
+		'mcf' => 'image/vasa',
+		'mcf' => 'text/mcf',
+		'mcp' => 'application/netmc',
+		'me' => 'application/x-troff-me',
+		'mht' => 'message/rfc822',
+		'mhtml' => 'message/rfc822',
+		'mid' => 'application/x-midi',
+		'mid' => 'audio/midi',
+		'mid' => 'audio/x-mid',
+		'mid' => 'audio/x-midi',
+		'mid' => 'music/crescendo',
+		'mid' => 'x-music/x-midi',
+		'midi' => 'application/x-midi',
+		'midi' => 'audio/midi',
+		'midi' => 'audio/x-mid',
+		'midi' => 'audio/x-midi',
+		'midi' => 'music/crescendo',
+		'midi' => 'x-music/x-midi',
+		'mif' => 'application/x-frame',
+		'mif' => 'application/x-mif',
+		'mime' => 'message/rfc822',
+		'mime' => 'www/mime',
+		'mjf' => 'audio/x-vnd.audioexplosion.mjuicemediafile',
+		'mjpg' => 'video/x-motion-jpeg',
+		'mm' => 'application/base64',
+		'mm' => 'application/x-meme',
+		'mme' => 'application/base64',
+		'mod' => 'audio/mod',
+		'mod' => 'audio/x-mod',
+		'moov' => 'video/quicktime',
+		'mov' => 'video/quicktime',
+		'movie' => 'video/x-sgi-movie',
+		'mp2' => 'audio/mpeg',
+		'mp2' => 'audio/x-mpeg',
+		'mp2' => 'video/mpeg',
+		'mp2' => 'video/x-mpeg',
+		'mp2' => 'video/x-mpeq2a',
+		'mp3' => 'audio/mpeg3',
+		'mp3' => 'audio/x-mpeg-3',
+		'mp3' => 'video/mpeg',
+		'mp3' => 'video/x-mpeg',
+		'mpa' => 'audio/mpeg',
+		'mpa' => 'video/mpeg',
+		'mpc' => 'application/x-project',
+		'mpe' => 'video/mpeg',
+		'mpeg' => 'video/mpeg',
+		'mpg' => 'audio/mpeg',
+		'mpg' => 'video/mpeg',
+		'mpga' => 'audio/mpeg',
+		'mpp' => 'application/vnd.ms-project',
+		'mpt' => 'application/x-project',
+		'mpv' => 'application/x-project',
+		'mpx' => 'application/x-project',
+		'mrc' => 'application/marc',
+		'ms' => 'application/x-troff-ms',
+		'mv' => 'video/x-sgi-movie',
+		'my' => 'audio/make',
+		'mzz' => 'application/x-vnd.audioexplosion.mzz',
+		'nap' => 'image/naplps',
+		'naplps' => 'image/naplps',
+		'nc' => 'application/x-netcdf',
+		'ncm' => 'application/vnd.nokia.configuration-message',
+		'nif' => 'image/x-niff',
+		'niff' => 'image/x-niff',
+		'nix' => 'application/x-mix-transfer',
+		'nsc' => 'application/x-conference',
+		'nvd' => 'application/x-navidoc',
+		'o' => 'application/octet-stream',
+		'oda' => 'application/oda',
+		'omc' => 'application/x-omc',
+		'omcd' => 'application/x-omcdatamaker',
+		'omcr' => 'application/x-omcregerator',
+		'p' => 'text/x-pascal',
+		'p10' => 'application/pkcs10',
+		'p10' => 'application/x-pkcs10',
+		'p12' => 'application/pkcs-12',
+		'p12' => 'application/x-pkcs12',
+		'p7a' => 'application/x-pkcs7-signature',
+		'p7c' => 'application/pkcs7-mime',
+		'p7c' => 'application/x-pkcs7-mime',
+		'p7m' => 'application/pkcs7-mime',
+		'p7m' => 'application/x-pkcs7-mime',
+		'p7r' => 'application/x-pkcs7-certreqresp',
+		'p7s' => 'application/pkcs7-signature',
+		'part' => 'application/pro_eng',
+		'pas' => 'text/pascal',
+		'pbm' => 'image/x-portable-bitmap',
+		'pcl' => 'application/vnd.hp-pcl',
+		'pcl' => 'application/x-pcl',
+		'pct' => 'image/x-pict',
+		'pcx' => 'image/x-pcx',
+		'pdb' => 'chemical/x-pdb',
+		'pdf' => 'application/pdf',
+		'pfunk' => 'audio/make',
+		'pfunk' => 'audio/make.my.funk',
+		'pgm' => 'image/x-portable-graymap',
+		'pgm' => 'image/x-portable-greymap',
+		'pic' => 'image/pict',
+		'pict' => 'image/pict',
+		'pkg' => 'application/x-newton-compatible-pkg',
+		'pko' => 'application/vnd.ms-pki.pko',
+		'pl' => 'text/plain',
+		'pl' => 'text/x-script.perl',
+		'plx' => 'application/x-pixclscript',
+		'pm' => 'image/x-xpixmap',
+		'pm' => 'text/x-script.perl-module',
+		'pm4' => 'application/x-pagemaker',
+		'pm5' => 'application/x-pagemaker',
+		'png' => 'image/png',
+		'pnm' => 'application/x-portable-anymap',
+		'pnm' => 'image/x-portable-anymap',
+		'pot' => 'application/mspowerpoint',
+		'pot' => 'application/vnd.ms-powerpoint',
+		'pov' => 'model/x-pov',
+		'ppa' => 'application/vnd.ms-powerpoint',
+		'ppm' => 'image/x-portable-pixmap',
+		'pps' => 'application/mspowerpoint',
+		'pps' => 'application/vnd.ms-powerpoint',
+		'ppt' => 'application/mspowerpoint',
+		'ppt' => 'application/powerpoint',
+		'ppt' => 'application/vnd.ms-powerpoint',
+		'ppt' => 'application/x-mspowerpoint',
+		'ppz' => 'application/mspowerpoint',
+		'pre' => 'application/x-freelance',
+		'prt' => 'application/pro_eng',
+		'ps' => 'application/postscript',
+		'psd' => 'application/octet-stream',
+		'pvu' => 'paleovu/x-pv',
+		'pwz' => 'application/vnd.ms-powerpoint',
+		'py' => 'text/x-script.phyton',
+		'pyc' => 'applicaiton/x-bytecode.python',
+		'qcp' => 'audio/vnd.qcelp',
+		'qd3' => 'x-world/x-3dmf',
+		'qd3d' => 'x-world/x-3dmf',
+		'qif' => 'image/x-quicktime',
+		'qt' => 'video/quicktime',
+		'qtc' => 'video/x-qtc',
+		'qti' => 'image/x-quicktime',
+		'qtif' => 'image/x-quicktime',
+		'ra' => 'audio/x-pn-realaudio',
+		'ra' => 'audio/x-pn-realaudio-plugin',
+		'ra' => 'audio/x-realaudio',
+		'ram' => 'audio/x-pn-realaudio',
+		'ras' => 'application/x-cmu-raster',
+		'ras' => 'image/cmu-raster',
+		'ras' => 'image/x-cmu-raster',
+		'rast' => 'image/cmu-raster',
+		'rexx' => 'text/x-script.rexx',
+		'rf' => 'image/vnd.rn-realflash',
+		'rgb' => 'image/x-rgb',
+		'rm' => 'application/vnd.rn-realmedia',
+		'rm' => 'audio/x-pn-realaudio',
+		'rmi' => 'audio/mid',
+		'rmm' => 'audio/x-pn-realaudio',
+		'rmp' => 'audio/x-pn-realaudio',
+		'rmp' => 'audio/x-pn-realaudio-plugin',
+		'rng' => 'application/ringing-tones',
+		'rng' => 'application/vnd.nokia.ringing-tone',
+		'rnx' => 'application/vnd.rn-realplayer',
+		'roff' => 'application/x-troff',
+		'rp' => 'image/vnd.rn-realpix',
+		'rpm' => 'audio/x-pn-realaudio-plugin',
+		'rt' => 'text/richtext',
+		'rt' => 'text/vnd.rn-realtext',
+		'rtf' => 'application/rtf',
+		'rtf' => 'application/x-rtf',
+		'rtf' => 'text/richtext',
+		'rtx' => 'application/rtf',
+		'rtx' => 'text/richtext',
+		'rv' => 'video/vnd.rn-realvideo',
+		's' => 'text/x-asm',
+		's3m' => 'audio/s3m',
+		'saveme' => 'application/octet-stream',
+		'sbk' => 'application/x-tbook',
+		'scm' => 'application/x-lotusscreencam',
+		'scm' => 'text/x-script.guile',
+		'scm' => 'text/x-script.scheme',
+		'scm' => 'video/x-scm',
+		'sdml' => 'text/plain',
+		'sdp' => 'application/sdp',
+		'sdp' => 'application/x-sdp',
+		'sdr' => 'application/sounder',
+		'sea' => 'application/sea',
+		'sea' => 'application/x-sea',
+		'set' => 'application/set',
+		'sgm' => 'text/sgml',
+		'sgm' => 'text/x-sgml',
+		'sgml' => 'text/sgml',
+		'sgml' => 'text/x-sgml',
+		'sh' => 'application/x-bsh',
+		'sh' => 'application/x-sh',
+		'sh' => 'application/x-shar',
+		'sh' => 'text/x-script.sh',
+		'shar' => 'application/x-bsh',
+		'shar' => 'application/x-shar',
+		'shtml' => 'text/html',
+		'sid' => 'audio/x-psid',
+		'sit' => 'application/x-sit',
+		'sit' => 'application/x-stuffit',
+		'skd' => 'application/x-koan',
+		'skm' => 'application/x-koan',
+		'skp' => 'application/x-koan',
+		'skt' => 'application/x-koan',
+		'sl' => 'application/x-seelogo',
+		'smi' => 'application/smil',
+		'smil' => 'application/smil',
+		'snd' => 'audio/basic',
+		'snd' => 'audio/x-adpcm',
+		'sol' => 'application/solids',
+		'spc' => 'application/x-pkcs7-certificates',
+		'spc' => 'text/x-speech',
+		'spl' => 'application/futuresplash',
+		'spr' => 'application/x-sprite',
+		'sprite' => 'application/x-sprite',
+		'src' => 'application/x-wais-source',
+		'ssi' => 'text/x-server-parsed-html',
+		'ssm' => 'application/streamingmedia',
+		'sst' => 'application/vnd.ms-pki.certstore',
+		'step' => 'application/step',
+		'stl' => 'application/sla',
+		'stl' => 'application/vnd.ms-pki.stl',
+		'stl' => 'application/x-navistyle',
+		'stp' => 'application/step',
+		'sv4cpio'=> 'application/x-sv4cpio',
+		'sv4crc' => 'application/x-sv4crc',
+		'svf' => 'image/vnd.dwg',
+		'svf' => 'image/x-dwg',
+		'svr' => 'application/x-world',
+		'svr' => 'x-world/x-svr',
+		'swf' => 'application/x-shockwave-flash',
+		't' => 'application/x-troff',
+		'talk' => 'text/x-speech',
+		'tar' => 'application/x-tar',
+		'tbk' => 'application/toolbook',
+		'tbk' => 'application/x-tbook',
+		'tcl' => 'application/x-tcl',
+		'tcl' => 'text/x-script.tcl',
+		'tcsh' => 'text/x-script.tcsh',
+		'tex' => 'application/x-tex',
+		'texi' => 'application/x-texinfo',
+		'texinfo'=> 'application/x-texinfo',
+		'text' => 'application/plain',
+		'text' => 'text/plain',
+		'tgz' => 'application/gnutar',
+		'tgz' => 'application/x-compressed',
+		'tif' => 'image/tiff',
+		'tif' => 'image/x-tiff',
+		'tiff' => 'image/tiff',
+		'tiff' => 'image/x-tiff',
+		'tr' => 'application/x-troff',
+		'tsi' => 'audio/tsp-audio',
+		'tsp' => 'application/dsptype',
+		'tsp' => 'audio/tsplayer',
+		'tsv' => 'text/tab-separated-values',
+		'turbot' => 'image/florian',
+		'txt' => 'text/plain',
+		'uil' => 'text/x-uil',
+		'uni' => 'text/uri-list',
+		'unis' => 'text/uri-list',
+		'unv' => 'application/i-deas',
+		'uri' => 'text/uri-list',
+		'uris' => 'text/uri-list',
+		'ustar' => 'application/x-ustar',
+		'ustar' => 'multipart/x-ustar',
+		'uu' => 'application/octet-stream',
+		'uu' => 'text/x-uuencode',
+		'uue' => 'text/x-uuencode',
+		'vcd' => 'application/x-cdlink',
+		'vcs' => 'text/x-vcalendar',
+		'vda' => 'application/vda',
+		'vdo' => 'video/vdo',
+		'vew' => 'application/groupwise',
+		'viv' => 'video/vivo',
+		'viv' => 'video/vnd.vivo',
+		'vivo' => 'video/vivo',
+		'vivo' => 'video/vnd.vivo',
+		'vmd' => 'application/vocaltec-media-desc',
+		'vmf' => 'application/vocaltec-media-file',
+		'voc' => 'audio/voc',
+		'voc' => 'audio/x-voc',
+		'vos' => 'video/vosaic',
+		'vox' => 'audio/voxware',
+		'vqe' => 'audio/x-twinvq-plugin',
+		'vqf' => 'audio/x-twinvq',
+		'vql' => 'audio/x-twinvq-plugin',
+		'vrml' => 'application/x-vrml',
+		'vrml' => 'model/vrml',
+		'vrml' => 'x-world/x-vrml',
+		'vrt' => 'x-world/x-vrt',
+		'vsd' => 'application/x-visio',
+		'vst' => 'application/x-visio',
+		'vsw' => 'application/x-visio',
+		'w60' => 'application/wordperfect6.0',
+		'w61' => 'application/wordperfect6.1',
+		'w6w' => 'application/msword',
+		'wav' => 'audio/wav',
+		'wav' => 'audio/x-wav',
+		'wb1' => 'application/x-qpro',
+		'wbmp' => 'image/vnd.wap.wbmp',
+		'web' => 'application/vnd.xara',
+		'wiz' => 'application/msword',
+		'wk1' => 'application/x-123',
+		'wmf' => 'windows/metafile',
+		'wml' => 'text/vnd.wap.wml',
+		'wmlc' => 'application/vnd.wap.wmlc',
+		'wmls' => 'text/vnd.wap.wmlscript',
+		'wmlsc' => 'application/vnd.wap.wmlscriptc',
+		'word' => 'application/msword',
+		'wp' => 'application/wordperfect',
+		'wp5' => 'application/wordperfect',
+		'wp5' => 'application/wordperfect6.0',
+		'wp6' => 'application/wordperfect',
+		'wpd' => 'application/wordperfect',
+		'wpd' => 'application/x-wpwin',
+		'wq1' => 'application/x-lotus',
+		'wri' => 'application/mswrite',
+		'wri' => 'application/x-wri',
+		'wrl' => 'application/x-world',
+		'wrl' => 'model/vrml',
+		'wrl' => 'x-world/x-vrml',
+		'wrz' => 'model/vrml',
+		'wrz' => 'x-world/x-vrml',
+		'wsc' => 'text/scriplet',
+		'wsrc' => 'application/x-wais-source',
+		'wtk' => 'application/x-wintalk',
+		'xbm' => 'image/x-xbitmap',
+		'xbm' => 'image/x-xbm',
+		'xbm' => 'image/xbm',
+		'xdr' => 'video/x-amt-demorun',
+		'xgz' => 'xgl/drawing',
+		'xif' => 'image/vnd.xiff',
+		'xl' => 'application/excel',
+		'xla' => 'application/excel',
+		'xla' => 'application/x-excel',
+		'xla' => 'application/x-msexcel',
+		'xlb' => 'application/excel',
+		'xlb' => 'application/vnd.ms-excel',
+		'xlb' => 'application/x-excel',
+		'xlc' => 'application/excel',
+		'xlc' => 'application/vnd.ms-excel',
+		'xlc' => 'application/x-excel',
+		'xld' => 'application/excel',
+		'xld' => 'application/x-excel',
+		'xlk' => 'application/excel',
+		'xlk' => 'application/x-excel',
+		'xll' => 'application/excel',
+		'xll' => 'application/vnd.ms-excel',
+		'xll' => 'application/x-excel',
+		'xlm' => 'application/excel',
+		'xlm' => 'application/vnd.ms-excel',
+		'xlm' => 'application/x-excel',
+		'xls' => 'application/excel',
+		'xls' => 'application/vnd.ms-excel',
+		'xls' => 'application/x-excel',
+		'xls' => 'application/x-msexcel',
+		'xlt' => 'application/excel',
+		'xlt' => 'application/x-excel',
+		'xlv' => 'application/excel',
+		'xlv' => 'application/x-excel',
+		'xlw' => 'application/excel',
+		'xlw' => 'application/vnd.ms-excel',
+		'xlw' => 'application/x-excel',
+		'xlw' => 'application/x-msexcel',
+		'xm' => 'audio/xm',
+		'xml' => 'application/xml',
+		'xml' => 'text/xml',
+		'xmz' => 'xgl/movie',
+		'xpix' => 'application/x-vnd.ls-xpix',
+		'xpm' => 'image/x-xpixmap',
+		'xpm' => 'image/xpm',
+		'x-png' => 'image/png',
+		'xsr' => 'video/x-amt-showrun',
+		'xwd' => 'image/x-xwd',
+		'xwd' => 'image/x-xwindowdump',
+		'xyz' => 'chemical/x-pdb',
+		'z' => array('application/x-compress', 'application/x-compressed'),
+		'zip' => 'application/x-compressed',
+		'zip' => 'application/x-zip-compressed',
+		'zip' => 'application/zip',
+		'zip' => 'multipart/x-zip',
+		'zoo' => 'application/octet-stream',
+		'zsh' => 'text/x-script.zsh',
+		'txt' => 'text/plain',
+		'htm' => 'text/html',
+		'html' => 'text/html',
+		'php' => 'application/x-httpd-php',
+		'phps' => 'application/x-httpd-phps',
+		'css' => 'text/css',
+		'js' => 'application/javascript',
+		'json' => 'application/json',
+		'xml' => 'application/xml',
+		'swf' => 'application/x-shockwave-flash',
+		'flv' => 'video/x-flv',
+		'asc' => 'text/plain',
+		'atom' => 'application/atom+xml',
+		'bcpio' => 'application/x-bcpio',
+		'png' => 'image/png',
+		'jpe' => 'image/jpeg',
+		'jpeg' => 'image/jpeg',
+		'jpg' => 'image/jpeg',
+		'gif' => 'image/gif',
+		'bmp' => 'image/bmp',
+		'ico' => 'image/vnd.microsoft.icon',
+		'tiff' => 'image/tiff',
+		'tif' => 'image/tiff',
+		'svg' => 'image/svg+xml',
+		'svgz' => 'image/svg+xml',
+		'zip' => 'application/zip',
+		'rar' => 'application/x-rar-compressed',
+		'exe' => 'application/x-msdownload',
+		'msi' => 'application/x-msdownload',
+		'cab' => 'application/vnd.ms-cab-compressed',
+		'mp3' => 'audio/mpeg',
+		'qt' => 'video/quicktime',
+		'mov' => 'video/quicktime',
+		'au' => 'audio/basic',
+		'avi' => 'video/x-msvideo',
+		'pdf' => 'application/pdf',
+		'psd' => 'image/vnd.adobe.photoshop',
+		'ai' => 'application/postscript',
+		'eps' => 'application/postscript',
+		'ps' => 'application/postscript',
+		'aif' => 'audio/x-aiff',
+		'aifc' => 'audio/x-aiff',
+		'aiff' => 'audio/x-aiff',
+		'doc' => 'application/msword',
+		'rtf' => 'application/rtf',
+		'xls' => 'application/vnd.ms-excel',
+		'ppt' => 'application/vnd.ms-powerpoint',
+		'odt' => 'application/vnd.oasis.opendocument.text',
+		'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+		'swf' => array('application/x-shockwave-flash', 'application/x-shockwave-flash2-preview', 'application/futuresplash', 'image/vnd.rn-realflash')
+	);
+
+
+	/**
+	 * override constructor
+	 * 2012-02-12 ms
+	 */
+	public function __construct() {
+
+	}
+
+ 	/**
+ 	 * get all mime types that are supported by cake php core right now
+ 	 * @return array
+ 	 * 2012-02-12 ms
+ 	 */
+ 	public function getMimeTypes($coreOnly = false) {
+ 		if ($coreOnly) {
+ 			return $this->_mimeTypes;
+ 		}
+ 		return array_merge($this->_mimeTypesExt, $this->_mimeTypes);
+ 	}
+
+	/**
+	 * Returns the mime type definition for an alias
+	 *
+	 * e.g `getMimeType('pdf'); // returns 'application/pdf'`
+	 *
+	 * @param string $alias the content type alias to map
+	 * @return mixed string mapped mime type or false if $alias is not mapped
+	 */
+ 	public function getMimeType($alias, $coreOnly = false) {
+ 		$res = parent::getMimeType($alias);
+ 		if ($res === false && !$coreOnly && isset($this->_mimeTypesExt[$alias])) {
+			return $this->_mimeTypesExt[$alias];
+ 		}
+ 		return $res;
+ 	}
+
+	/**
+	 * Maps a content-type back to an alias
+	 *
+	 * e.g `mapType('application/pdf'); // returns 'pdf'`
+	 *
+	 * @param mixed $ctype Either a string content type to map, or an array of types.
+	 * @return mixed Aliases for the types provided.
+	 */
+	public function mapType($ctype) {
+		return parent::mapType($ctype);
+	}
+
+
+	/**
+	* @desc Retrieve the corresponding MIME type, if one exists
+	* @param String $file File Name (relative location such as "image_test.jpg" or full "http://site.com/path/to/image_test.jpg")
+	* @return String $MIMEType - The type of the file passed in the argument
+	*/
+	public function extractMimeType($file = NULL) {
+		if (is_file($file)) {
+			/**
+			* Attempts to retrieve file info from FINFO
+			* If FINFO functions are not available then try to retrieve MIME type from pre-defined MIMEs
+			* If MIME type doesn't exist, then try (as a last resort) to use the (deprecated) mime_content_type function
+			* If all else fails, just return application/octet-stream
+			*/
+			if (!function_exists("finfo_open")) {
+				if (function_exists("mime_content_type")) {
+					$type = mime_content_type($file);
+					if (!empty($type)) {
+						return $type;
+					}
+				}
+				$extension = $this->_getExtension($file);
+				if ($mimeType = $this->getMimeType($extension)) {
+					return $mimeType;
+				} else {
+					return "application/octet-stream";
+				}
+			} else {
+				$finfo = finfo_open(FILEINFO_MIME_TYPE);
+				$mimeType = finfo_file($finfo, $file);
+				finfo_close($finfo);
+				return $mimeType;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Write your Description here.
+	 *
+	 * Created: 22.10.10 23:37
+	 * Updated: 22.10.10 23:37
+	 * @return void
+	 * @param string $file
+	 * @param string $default
+	 * @access public
+	 * @author deltacahos
+	 */
+	public function getEncoding($file = NULL, $default = 'utf-8') {
+		if (!function_exists("finfo_open")) {
+			return $default;
+		}
+		$finfo = finfo_open(FILEINFO_MIME_ENCODING);
+		$encoding = finfo_file($finfo, $file);
+		finfo_close($finfo);
+		if ($encoding !== FALSE) {
+			return $encoding;
+		}
+		return $default;
+	}
+
+	/**
+	* @desc Gets the file extention from a string
+	* @param String $file The full file name
+	* @return String $ext The file extension
+	*/
+	protected function _getExtension($file = NULL) {
+		if (!is_null($file)) {
+			$ext = strtolower(array_pop(explode('.', $file)));
+			return $ext;
+		}
+		return false;
+	}
+
+}

+ 89 - 0
Test/Case/Lib/MimeLibTest.php

@@ -0,0 +1,89 @@
+<?php
+
+App::uses('MimeLib', 'Tools.Lib');
+App::uses('MyCakeTestCase', 'Tools.TestSuite');
+
+class MimeLibTest extends MyCakeTestCase {
+
+	public $Mime;
+
+	public function setUp() {
+		parent::setUp();
+
+		$this->Mime = new MimeLib();
+	}
+
+
+	public function testObject() {
+		$this->assertTrue(is_object($this->Mime));
+		$this->assertInstanceOf('MimeLib', $this->Mime);
+	}
+
+	public function testAll() {
+		$res = $this->Mime->getMimeTypes();
+		$this->assertTrue(is_array($res) && count($res) > 100);
+	}
+
+	public function testSingle() {
+		$res = $this->Mime->getMimeType('csv');
+		$this->assertTrue(is_array($res) && count($res) > 2);
+
+		$res = $this->Mime->getMimeType('ods', true);
+		$this->assertFalse($res);
+
+		$res = $this->Mime->getMimeType('ods');
+		$this->assertEquals('application/vnd.oasis.opendocument.spreadsheet', $res);
+	}
+
+	public function testSingleReverse() {
+		$res = $this->Mime->getMimeType('csv');
+		$this->assertTrue(is_array($res) && count($res) > 2);
+	}
+
+
+	/**
+	 * test fake files
+	 * 2010-10-22 ms
+	 */
+	public function testCorrectFileExtension() {
+		file_put_contents(TMP.'sometest.txt', 'xyz');
+		$is = $this->Mime->extractMimeType(TMP.'sometest.txt');
+		pr($is);
+		$this->assertEquals($is, 'text/plain');
+	}
+
+	/**
+	 * test fake files
+	 * 2010-10-22 ms
+	 */
+	public function testWrongFileExtension() {
+		file_put_contents(TMP.'sometest.zip', 'xyz');
+		$is = $this->Mime->extractMimeType(TMP.'sometest.zip');
+		pr($is);
+		$this->assertEquals($is, 'text/plain');
+		//Test failes? finfo_open not availaible??
+	}
+
+	/**
+	 * test fake files
+	 * 2010-10-22 ms
+	 */
+	public function testEncoding() {
+		file_put_contents(TMP.'sometest.txt', 'xyz');
+		$is = $this->Mime->getEncoding(TMP.'sometest.txt');
+		pr($is);
+		$this->assertEquals($is, 'us-ascii');
+
+		file_put_contents(TMP.'sometest.zip', utf8_encode('xäääyz'));
+		$is = $this->Mime->getEncoding(TMP.'sometest.zip');
+		pr($is);
+		$this->assertEquals($is, 'utf-8');
+
+		file_put_contents(TMP.'sometest.zip', utf8_encode('xyz'));
+		$is = $this->Mime->getEncoding(TMP.'sometest.zip');
+		pr($is);
+		$this->assertEquals($is, 'us-ascii');
+
+		//Tests fail? finfo_open not availaible??
+	}
+}