| Total Complexity | 49 |
| Total Lines | 1604 |
| Duplicated Lines | 0 % |
| Changes | 10 | ||
| Bugs | 3 | Features | 1 |
Complex classes like Filesystem often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Filesystem, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 37 | class Filesystem |
||
| 38 | { |
||
| 39 | /** |
||
| 40 | * Permissions |
||
| 41 | * |
||
| 42 | * @var array |
||
| 43 | */ |
||
| 44 | protected static $permissions = [ |
||
| 45 | 'file' => [ |
||
| 46 | 'public' => 0644, |
||
| 47 | 'private' => 0600, |
||
| 48 | ], |
||
| 49 | 'dir' => [ |
||
| 50 | 'public' => 0755, |
||
| 51 | 'private' => 0700, |
||
| 52 | ], |
||
| 53 | ]; |
||
| 54 | |||
| 55 | /** |
||
| 56 | * Mime type list |
||
| 57 | * |
||
| 58 | * @var array |
||
| 59 | */ |
||
| 60 | public static $mime_types = [ |
||
| 61 | '1km' => 'application/vnd.1000minds.decision-model+xml', |
||
| 62 | '3dml' => 'text/vnd.in3d.3dml', |
||
| 63 | '3ds' => 'image/x-3ds', |
||
| 64 | '3g2' => 'video/3gpp2', |
||
| 65 | '3gp' => 'video/3gp', |
||
| 66 | '3gpp' => 'video/3gpp', |
||
| 67 | '3mf' => 'model/3mf', |
||
| 68 | '7z' => 'application/x-7z-compressed', |
||
| 69 | '7zip' => 'application/x-7z-compressed', |
||
| 70 | '123' => 'application/vnd.lotus-1-2-3', |
||
| 71 | 'aab' => 'application/x-authorware-bin', |
||
| 72 | 'aac' => 'audio/x-acc', |
||
| 73 | 'aam' => 'application/x-authorware-map', |
||
| 74 | 'aas' => 'application/x-authorware-seg', |
||
| 75 | 'abw' => 'application/x-abiword', |
||
| 76 | 'ac' => 'application/vnd.nokia.n-gage.ac+xml', |
||
| 77 | 'ac3' => 'audio/ac3', |
||
| 78 | 'acc' => 'application/vnd.americandynamics.acc', |
||
| 79 | 'ace' => 'application/x-ace-compressed', |
||
| 80 | 'acu' => 'application/vnd.acucobol', |
||
| 81 | 'acutc' => 'application/vnd.acucorp', |
||
| 82 | 'adp' => 'audio/adpcm', |
||
| 83 | 'aep' => 'application/vnd.audiograph', |
||
| 84 | 'afm' => 'application/x-font-type1', |
||
| 85 | 'afp' => 'application/vnd.ibm.modcap', |
||
| 86 | 'ahead' => 'application/vnd.ahead.space', |
||
| 87 | 'ai' => 'application/pdf', |
||
| 88 | 'aif' => 'audio/x-aiff', |
||
| 89 | 'aifc' => 'audio/x-aiff', |
||
| 90 | 'aiff' => 'audio/x-aiff', |
||
| 91 | 'air' => 'application/vnd.adobe.air-application-installer-package+zip', |
||
| 92 | 'ait' => 'application/vnd.dvb.ait', |
||
| 93 | 'ami' => 'application/vnd.amiga.ami', |
||
| 94 | 'apk' => 'application/vnd.android.package-archive', |
||
| 95 | 'apng' => 'image/apng', |
||
| 96 | 'appcache' => 'text/cache-manifest', |
||
| 97 | 'application' => 'application/x-ms-application', |
||
| 98 | 'apr' => 'application/vnd.lotus-approach', |
||
| 99 | 'arc' => 'application/x-freearc', |
||
| 100 | 'arj' => 'application/x-arj', |
||
| 101 | 'asc' => 'application/pgp-signature', |
||
| 102 | 'asf' => 'video/x-ms-asf', |
||
| 103 | 'asm' => 'text/x-asm', |
||
| 104 | 'aso' => 'application/vnd.accpac.simply.aso', |
||
| 105 | 'asx' => 'video/x-ms-asf', |
||
| 106 | 'atc' => 'application/vnd.acucorp', |
||
| 107 | 'atom' => 'application/atom+xml', |
||
| 108 | 'atomcat' => 'application/atomcat+xml', |
||
| 109 | 'atomdeleted' => 'application/atomdeleted+xml', |
||
| 110 | 'atomsvc' => 'application/atomsvc+xml', |
||
| 111 | 'atx' => 'application/vnd.antix.game-component', |
||
| 112 | 'au' => 'audio/x-au', |
||
| 113 | 'avi' => 'video/x-msvideo', |
||
| 114 | 'avif' => 'image/avif', |
||
| 115 | 'aw' => 'application/applixware', |
||
| 116 | 'azf' => 'application/vnd.airzip.filesecure.azf', |
||
| 117 | 'azs' => 'application/vnd.airzip.filesecure.azs', |
||
| 118 | 'azv' => 'image/vnd.airzip.accelerator.azv', |
||
| 119 | 'azw' => 'application/vnd.amazon.ebook', |
||
| 120 | 'bat' => 'application/x-msdownload', |
||
| 121 | 'bcpio' => 'application/x-bcpio', |
||
| 122 | 'bdf' => 'application/x-font-bdf', |
||
| 123 | 'bdm' => 'application/vnd.syncml.dm+wbxml', |
||
| 124 | 'bdoc' => 'application/x-bdoc', |
||
| 125 | 'bed' => 'application/vnd.realvnc.bed', |
||
| 126 | 'bh2' => 'application/vnd.fujitsu.oasysprs', |
||
| 127 | 'bin' => 'application/octet-stream', |
||
| 128 | 'blb' => 'application/x-blorb', |
||
| 129 | 'blorb' => 'application/x-blorb', |
||
| 130 | 'bmi' => 'application/vnd.bmi', |
||
| 131 | 'bmml' => 'application/vnd.balsamiq.bmml+xml', |
||
| 132 | 'bmp' => 'image/bmp', |
||
| 133 | 'book' => 'application/vnd.framemaker', |
||
| 134 | 'box' => 'application/vnd.previewsystems.box', |
||
| 135 | 'boz' => 'application/x-bzip2', |
||
| 136 | 'bpk' => 'application/octet-stream', |
||
| 137 | 'bpmn' => 'application/octet-stream', |
||
| 138 | 'bsp' => 'model/vnd.valve.source.compiled-map', |
||
| 139 | 'btif' => 'image/prs.btif', |
||
| 140 | 'buffer' => 'application/octet-stream', |
||
| 141 | 'bz' => 'application/x-bzip', |
||
| 142 | 'bz2' => 'application/x-bzip2', |
||
| 143 | 'c' => 'text/x-c', |
||
| 144 | 'c4d' => 'application/vnd.clonk.c4group', |
||
| 145 | 'c4f' => 'application/vnd.clonk.c4group', |
||
| 146 | 'c4g' => 'application/vnd.clonk.c4group', |
||
| 147 | 'c4p' => 'application/vnd.clonk.c4group', |
||
| 148 | 'c4u' => 'application/vnd.clonk.c4group', |
||
| 149 | 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', |
||
| 150 | 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', |
||
| 151 | 'cab' => 'application/vnd.ms-cab-compressed', |
||
| 152 | 'caf' => 'audio/x-caf', |
||
| 153 | 'cap' => 'application/vnd.tcpdump.pcap', |
||
| 154 | 'car' => 'application/vnd.curl.car', |
||
| 155 | 'cat' => 'application/vnd.ms-pki.seccat', |
||
| 156 | 'cb7' => 'application/x-cbr', |
||
| 157 | 'cba' => 'application/x-cbr', |
||
| 158 | 'cbr' => 'application/x-cbr', |
||
| 159 | 'cbt' => 'application/x-cbr', |
||
| 160 | 'cbz' => 'application/x-cbr', |
||
| 161 | 'cc' => 'text/x-c', |
||
| 162 | 'cco' => 'application/x-cocoa', |
||
| 163 | 'cct' => 'application/x-director', |
||
| 164 | 'ccxml' => 'application/ccxml+xml', |
||
| 165 | 'cdbcmsg' => 'application/vnd.contact.cmsg', |
||
| 166 | 'cdf' => 'application/x-netcdf', |
||
| 167 | 'cdfx' => 'application/cdfx+xml', |
||
| 168 | 'cdkey' => 'application/vnd.mediastation.cdkey', |
||
| 169 | 'cdmia' => 'application/cdmi-capability', |
||
| 170 | 'cdmic' => 'application/cdmi-container', |
||
| 171 | 'cdmid' => 'application/cdmi-domain', |
||
| 172 | 'cdmio' => 'application/cdmi-object', |
||
| 173 | 'cdmiq' => 'application/cdmi-queue', |
||
| 174 | 'cdr' => 'application/cdr', |
||
| 175 | 'cdx' => 'chemical/x-cdx', |
||
| 176 | 'cdxml' => 'application/vnd.chemdraw+xml', |
||
| 177 | 'cdy' => 'application/vnd.cinderella', |
||
| 178 | 'cer' => 'application/pkix-cert', |
||
| 179 | 'cfs' => 'application/x-cfs-compressed', |
||
| 180 | 'cgm' => 'image/cgm', |
||
| 181 | 'chat' => 'application/x-chat', |
||
| 182 | 'chm' => 'application/vnd.ms-htmlhelp', |
||
| 183 | 'chrt' => 'application/vnd.kde.kchart', |
||
| 184 | 'cif' => 'chemical/x-cif', |
||
| 185 | 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', |
||
| 186 | 'cil' => 'application/vnd.ms-artgalry', |
||
| 187 | 'cjs' => 'application/node', |
||
| 188 | 'cla' => 'application/vnd.claymore', |
||
| 189 | 'class' => 'application/octet-stream', |
||
| 190 | 'clkk' => 'application/vnd.crick.clicker.keyboard', |
||
| 191 | 'clkp' => 'application/vnd.crick.clicker.palette', |
||
| 192 | 'clkt' => 'application/vnd.crick.clicker.template', |
||
| 193 | 'clkw' => 'application/vnd.crick.clicker.wordbank', |
||
| 194 | 'clkx' => 'application/vnd.crick.clicker', |
||
| 195 | 'clp' => 'application/x-msclip', |
||
| 196 | 'cmc' => 'application/vnd.cosmocaller', |
||
| 197 | 'cmdf' => 'chemical/x-cmdf', |
||
| 198 | 'cml' => 'chemical/x-cml', |
||
| 199 | 'cmp' => 'application/vnd.yellowriver-custom-menu', |
||
| 200 | 'cmx' => 'image/x-cmx', |
||
| 201 | 'cod' => 'application/vnd.rim.cod', |
||
| 202 | 'coffee' => 'text/coffeescript', |
||
| 203 | 'com' => 'application/x-msdownload', |
||
| 204 | 'conf' => 'text/plain', |
||
| 205 | 'cpio' => 'application/x-cpio', |
||
| 206 | 'cpp' => 'text/x-c', |
||
| 207 | 'cpt' => 'application/mac-compactpro', |
||
| 208 | 'crd' => 'application/x-mscardfile', |
||
| 209 | 'crl' => 'application/pkix-crl', |
||
| 210 | 'crt' => 'application/x-x509-ca-cert', |
||
| 211 | 'crx' => 'application/x-chrome-extension', |
||
| 212 | 'cryptonote' => 'application/vnd.rig.cryptonote', |
||
| 213 | 'csh' => 'application/x-csh', |
||
| 214 | 'csl' => 'application/vnd.citationstyles.style+xml', |
||
| 215 | 'csml' => 'chemical/x-csml', |
||
| 216 | 'csp' => 'application/vnd.commonspace', |
||
| 217 | 'csr' => 'application/octet-stream', |
||
| 218 | 'css' => 'text/css', |
||
| 219 | 'cst' => 'application/x-director', |
||
| 220 | 'csv' => 'text/csv', |
||
| 221 | 'cu' => 'application/cu-seeme', |
||
| 222 | 'curl' => 'text/vnd.curl', |
||
| 223 | 'cww' => 'application/prs.cww', |
||
| 224 | 'cxt' => 'application/x-director', |
||
| 225 | 'cxx' => 'text/x-c', |
||
| 226 | 'dae' => 'model/vnd.collada+xml', |
||
| 227 | 'daf' => 'application/vnd.mobius.daf', |
||
| 228 | 'dart' => 'application/vnd.dart', |
||
| 229 | 'dataless' => 'application/vnd.fdsn.seed', |
||
| 230 | 'davmount' => 'application/davmount+xml', |
||
| 231 | 'dbk' => 'application/docbook+xml', |
||
| 232 | 'dcr' => 'application/x-director', |
||
| 233 | 'dcurl' => 'text/vnd.curl.dcurl', |
||
| 234 | 'dd2' => 'application/vnd.oma.dd2+xml', |
||
| 235 | 'ddd' => 'application/vnd.fujixerox.ddd', |
||
| 236 | 'ddf' => 'application/vnd.syncml.dmddf+xml', |
||
| 237 | 'dds' => 'image/vnd.ms-dds', |
||
| 238 | 'deb' => 'application/x-debian-package', |
||
| 239 | 'def' => 'text/plain', |
||
| 240 | 'deploy' => 'application/octet-stream', |
||
| 241 | 'der' => 'application/x-x509-ca-cert', |
||
| 242 | 'dfac' => 'application/vnd.dreamfactory', |
||
| 243 | 'dgc' => 'application/x-dgc-compressed', |
||
| 244 | 'dic' => 'text/x-c', |
||
| 245 | 'dir' => 'application/x-director', |
||
| 246 | 'dis' => 'application/vnd.mobius.dis', |
||
| 247 | 'disposition-notification' => 'message/disposition-notification', |
||
| 248 | 'dist' => 'application/octet-stream', |
||
| 249 | 'distz' => 'application/octet-stream', |
||
| 250 | 'djv' => 'image/vnd.djvu', |
||
| 251 | 'djvu' => 'image/vnd.djvu', |
||
| 252 | 'dll' => 'application/octet-stream', |
||
| 253 | 'dmg' => 'application/x-apple-diskimage', |
||
| 254 | 'dmn' => 'application/octet-stream', |
||
| 255 | 'dmp' => 'application/vnd.tcpdump.pcap', |
||
| 256 | 'dms' => 'application/octet-stream', |
||
| 257 | 'dna' => 'application/vnd.dna', |
||
| 258 | 'doc' => 'application/msword', |
||
| 259 | 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', |
||
| 260 | 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
||
| 261 | 'dot' => 'application/msword', |
||
| 262 | 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', |
||
| 263 | 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', |
||
| 264 | 'dp' => 'application/vnd.osgi.dp', |
||
| 265 | 'dpg' => 'application/vnd.dpgraph', |
||
| 266 | 'dra' => 'audio/vnd.dra', |
||
| 267 | 'drle' => 'image/dicom-rle', |
||
| 268 | 'dsc' => 'text/prs.lines.tag', |
||
| 269 | 'dssc' => 'application/dssc+der', |
||
| 270 | 'dtb' => 'application/x-dtbook+xml', |
||
| 271 | 'dtd' => 'application/xml-dtd', |
||
| 272 | 'dts' => 'audio/vnd.dts', |
||
| 273 | 'dtshd' => 'audio/vnd.dts.hd', |
||
| 274 | 'dump' => 'application/octet-stream', |
||
| 275 | 'dvb' => 'video/vnd.dvb.file', |
||
| 276 | 'dvi' => 'application/x-dvi', |
||
| 277 | 'dwd' => 'application/atsc-dwd+xml', |
||
| 278 | 'dwf' => 'model/vnd.dwf', |
||
| 279 | 'dwg' => 'image/vnd.dwg', |
||
| 280 | 'dxf' => 'image/vnd.dxf', |
||
| 281 | 'dxp' => 'application/vnd.spotfire.dxp', |
||
| 282 | 'dxr' => 'application/x-director', |
||
| 283 | 'ear' => 'application/java-archive', |
||
| 284 | 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', |
||
| 285 | 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', |
||
| 286 | 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', |
||
| 287 | 'ecma' => 'application/ecmascript', |
||
| 288 | 'edm' => 'application/vnd.novadigm.edm', |
||
| 289 | 'edx' => 'application/vnd.novadigm.edx', |
||
| 290 | 'efif' => 'application/vnd.picsel', |
||
| 291 | 'ei6' => 'application/vnd.pg.osasli', |
||
| 292 | 'elc' => 'application/octet-stream', |
||
| 293 | 'emf' => 'image/emf', |
||
| 294 | 'eml' => 'message/rfc822', |
||
| 295 | 'emma' => 'application/emma+xml', |
||
| 296 | 'emotionml' => 'application/emotionml+xml', |
||
| 297 | 'emz' => 'application/x-msmetafile', |
||
| 298 | 'eol' => 'audio/vnd.digital-winds', |
||
| 299 | 'eot' => 'application/vnd.ms-fontobject', |
||
| 300 | 'eps' => 'application/postscript', |
||
| 301 | 'epub' => 'application/epub+zip', |
||
| 302 | 'es' => 'application/ecmascript', |
||
| 303 | 'es3' => 'application/vnd.eszigno3+xml', |
||
| 304 | 'esa' => 'application/vnd.osgi.subsystem', |
||
| 305 | 'esf' => 'application/vnd.epson.esf', |
||
| 306 | 'et3' => 'application/vnd.eszigno3+xml', |
||
| 307 | 'etx' => 'text/x-setext', |
||
| 308 | 'eva' => 'application/x-eva', |
||
| 309 | 'evy' => 'application/x-envoy', |
||
| 310 | 'exe' => 'application/octet-stream', |
||
| 311 | 'exi' => 'application/exi', |
||
| 312 | 'exr' => 'image/aces', |
||
| 313 | 'ext' => 'application/vnd.novadigm.ext', |
||
| 314 | 'ez' => 'application/andrew-inset', |
||
| 315 | 'ez2' => 'application/vnd.ezpix-album', |
||
| 316 | 'ez3' => 'application/vnd.ezpix-package', |
||
| 317 | 'f' => 'text/x-fortran', |
||
| 318 | 'f4v' => 'video/mp4', |
||
| 319 | 'f77' => 'text/x-fortran', |
||
| 320 | 'f90' => 'text/x-fortran', |
||
| 321 | 'fbs' => 'image/vnd.fastbidsheet', |
||
| 322 | 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', |
||
| 323 | 'fcs' => 'application/vnd.isac.fcs', |
||
| 324 | 'fdf' => 'application/vnd.fdf', |
||
| 325 | 'fdt' => 'application/fdt+xml', |
||
| 326 | 'fe_launch' => 'application/vnd.denovo.fcselayout-link', |
||
| 327 | 'fg5' => 'application/vnd.fujitsu.oasysgp', |
||
| 328 | 'fgd' => 'application/x-director', |
||
| 329 | 'fh' => 'image/x-freehand', |
||
| 330 | 'fh4' => 'image/x-freehand', |
||
| 331 | 'fh5' => 'image/x-freehand', |
||
| 332 | 'fh7' => 'image/x-freehand', |
||
| 333 | 'fhc' => 'image/x-freehand', |
||
| 334 | 'fig' => 'application/x-xfig', |
||
| 335 | 'fits' => 'image/fits', |
||
| 336 | 'flac' => 'audio/x-flac', |
||
| 337 | 'fli' => 'video/x-fli', |
||
| 338 | 'flo' => 'application/vnd.micrografx.flo', |
||
| 339 | 'flv' => 'video/x-flv', |
||
| 340 | 'flw' => 'application/vnd.kde.kivio', |
||
| 341 | 'flx' => 'text/vnd.fmi.flexstor', |
||
| 342 | 'fly' => 'text/vnd.fly', |
||
| 343 | 'fm' => 'application/vnd.framemaker', |
||
| 344 | 'fnc' => 'application/vnd.frogans.fnc', |
||
| 345 | 'fo' => 'application/vnd.software602.filler.form+xml', |
||
| 346 | 'for' => 'text/x-fortran', |
||
| 347 | 'fpx' => 'image/vnd.fpx', |
||
| 348 | 'frame' => 'application/vnd.framemaker', |
||
| 349 | 'fsc' => 'application/vnd.fsc.weblaunch', |
||
| 350 | 'fst' => 'image/vnd.fst', |
||
| 351 | 'ftc' => 'application/vnd.fluxtime.clip', |
||
| 352 | 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', |
||
| 353 | 'fvt' => 'video/vnd.fvt', |
||
| 354 | 'fxp' => 'application/vnd.adobe.fxp', |
||
| 355 | 'fxpl' => 'application/vnd.adobe.fxp', |
||
| 356 | 'fzs' => 'application/vnd.fuzzysheet', |
||
| 357 | 'g2w' => 'application/vnd.geoplan', |
||
| 358 | 'g3' => 'image/g3fax', |
||
| 359 | 'g3w' => 'application/vnd.geospace', |
||
| 360 | 'gac' => 'application/vnd.groove-account', |
||
| 361 | 'gam' => 'application/x-tads', |
||
| 362 | 'gbr' => 'application/rpki-ghostbusters', |
||
| 363 | 'gca' => 'application/x-gca-compressed', |
||
| 364 | 'gdl' => 'model/vnd.gdl', |
||
| 365 | 'gdoc' => 'application/vnd.google-apps.document', |
||
| 366 | 'geo' => 'application/vnd.dynageo', |
||
| 367 | 'geojson' => 'application/geo+json', |
||
| 368 | 'gex' => 'application/vnd.geometry-explorer', |
||
| 369 | 'ggb' => 'application/vnd.geogebra.file', |
||
| 370 | 'ggt' => 'application/vnd.geogebra.tool', |
||
| 371 | 'ghf' => 'application/vnd.groove-help', |
||
| 372 | 'gif' => 'image/gif', |
||
| 373 | 'gim' => 'application/vnd.groove-identity-message', |
||
| 374 | 'glb' => 'model/gltf-binary', |
||
| 375 | 'gltf' => 'model/gltf+json', |
||
| 376 | 'gml' => 'application/gml+xml', |
||
| 377 | 'gmx' => 'application/vnd.gmx', |
||
| 378 | 'gnumeric' => 'application/x-gnumeric', |
||
| 379 | 'gpg' => 'application/gpg-keys', |
||
| 380 | 'gph' => 'application/vnd.flographit', |
||
| 381 | 'gpx' => 'application/gpx+xml', |
||
| 382 | 'gqf' => 'application/vnd.grafeq', |
||
| 383 | 'gqs' => 'application/vnd.grafeq', |
||
| 384 | 'gram' => 'application/srgs', |
||
| 385 | 'gramps' => 'application/x-gramps-xml', |
||
| 386 | 'gre' => 'application/vnd.geometry-explorer', |
||
| 387 | 'grv' => 'application/vnd.groove-injector', |
||
| 388 | 'grxml' => 'application/srgs+xml', |
||
| 389 | 'gsf' => 'application/x-font-ghostscript', |
||
| 390 | 'gsheet' => 'application/vnd.google-apps.spreadsheet', |
||
| 391 | 'gslides' => 'application/vnd.google-apps.presentation', |
||
| 392 | 'gtar' => 'application/x-gtar', |
||
| 393 | 'gtm' => 'application/vnd.groove-tool-message', |
||
| 394 | 'gtw' => 'model/vnd.gtw', |
||
| 395 | 'gv' => 'text/vnd.graphviz', |
||
| 396 | 'gxf' => 'application/gxf', |
||
| 397 | 'gxt' => 'application/vnd.geonext', |
||
| 398 | 'gz' => 'application/x-gzip', |
||
| 399 | 'gzip' => 'application/x-gzip', |
||
| 400 | 'h' => 'text/x-c', |
||
| 401 | 'h261' => 'video/h261', |
||
| 402 | 'h263' => 'video/h263', |
||
| 403 | 'h264' => 'video/h264', |
||
| 404 | 'hal' => 'application/vnd.hal+xml', |
||
| 405 | 'hbci' => 'application/vnd.hbci', |
||
| 406 | 'hbs' => 'text/x-handlebars-template', |
||
| 407 | 'hdd' => 'application/x-virtualbox-hdd', |
||
| 408 | 'hdf' => 'application/x-hdf', |
||
| 409 | 'heic' => 'image/heic', |
||
| 410 | 'heics' => 'image/heic-sequence', |
||
| 411 | 'heif' => 'image/heif', |
||
| 412 | 'heifs' => 'image/heif-sequence', |
||
| 413 | 'hej2' => 'image/hej2k', |
||
| 414 | 'held' => 'application/atsc-held+xml', |
||
| 415 | 'hh' => 'text/x-c', |
||
| 416 | 'hjson' => 'application/hjson', |
||
| 417 | 'hlp' => 'application/winhlp', |
||
| 418 | 'hpgl' => 'application/vnd.hp-hpgl', |
||
| 419 | 'hpid' => 'application/vnd.hp-hpid', |
||
| 420 | 'hps' => 'application/vnd.hp-hps', |
||
| 421 | 'hqx' => 'application/mac-binhex40', |
||
| 422 | 'hsj2' => 'image/hsj2', |
||
| 423 | 'htc' => 'text/x-component', |
||
| 424 | 'htke' => 'application/vnd.kenameaapp', |
||
| 425 | 'htm' => 'text/html', |
||
| 426 | 'html' => 'text/html', |
||
| 427 | 'hvd' => 'application/vnd.yamaha.hv-dic', |
||
| 428 | 'hvp' => 'application/vnd.yamaha.hv-voice', |
||
| 429 | 'hvs' => 'application/vnd.yamaha.hv-script', |
||
| 430 | 'i2g' => 'application/vnd.intergeo', |
||
| 431 | 'icc' => 'application/vnd.iccprofile', |
||
| 432 | 'ice' => 'x-conference/x-cooltalk', |
||
| 433 | 'icm' => 'application/vnd.iccprofile', |
||
| 434 | 'ico' => 'image/x-icon', |
||
| 435 | 'ics' => 'text/calendar', |
||
| 436 | 'ief' => 'image/ief', |
||
| 437 | 'ifb' => 'text/calendar', |
||
| 438 | 'ifm' => 'application/vnd.shana.informed.formdata', |
||
| 439 | 'iges' => 'model/iges', |
||
| 440 | 'igl' => 'application/vnd.igloader', |
||
| 441 | 'igm' => 'application/vnd.insors.igm', |
||
| 442 | 'igs' => 'model/iges', |
||
| 443 | 'igx' => 'application/vnd.micrografx.igx', |
||
| 444 | 'iif' => 'application/vnd.shana.informed.interchange', |
||
| 445 | 'img' => 'application/octet-stream', |
||
| 446 | 'imp' => 'application/vnd.accpac.simply.imp', |
||
| 447 | 'ims' => 'application/vnd.ms-ims', |
||
| 448 | 'in' => 'text/plain', |
||
| 449 | 'ini' => 'text/plain', |
||
| 450 | 'ink' => 'application/inkml+xml', |
||
| 451 | 'inkml' => 'application/inkml+xml', |
||
| 452 | 'install' => 'application/x-install-instructions', |
||
| 453 | 'iota' => 'application/vnd.astraea-software.iota', |
||
| 454 | 'ipfix' => 'application/ipfix', |
||
| 455 | 'ipk' => 'application/vnd.shana.informed.package', |
||
| 456 | 'irm' => 'application/vnd.ibm.rights-management', |
||
| 457 | 'irp' => 'application/vnd.irepository.package+xml', |
||
| 458 | 'iso' => 'application/x-iso9660-image', |
||
| 459 | 'itp' => 'application/vnd.shana.informed.formtemplate', |
||
| 460 | 'its' => 'application/its+xml', |
||
| 461 | 'ivp' => 'application/vnd.immervision-ivp', |
||
| 462 | 'ivu' => 'application/vnd.immervision-ivu', |
||
| 463 | 'jad' => 'text/vnd.sun.j2me.app-descriptor', |
||
| 464 | 'jade' => 'text/jade', |
||
| 465 | 'jam' => 'application/vnd.jam', |
||
| 466 | 'jar' => 'application/java-archive', |
||
| 467 | 'jardiff' => 'application/x-java-archive-diff', |
||
| 468 | 'java' => 'text/x-java-source', |
||
| 469 | 'jhc' => 'image/jphc', |
||
| 470 | 'jisp' => 'application/vnd.jisp', |
||
| 471 | 'jls' => 'image/jls', |
||
| 472 | 'jlt' => 'application/vnd.hp-jlyt', |
||
| 473 | 'jng' => 'image/x-jng', |
||
| 474 | 'jnlp' => 'application/x-java-jnlp-file', |
||
| 475 | 'joda' => 'application/vnd.joost.joda-archive', |
||
| 476 | 'jp2' => 'image/jp2', |
||
| 477 | 'jpe' => 'image/jpeg', |
||
| 478 | 'jpeg' => 'image/jpeg', |
||
| 479 | 'jpf' => 'image/jpx', |
||
| 480 | 'jpg' => 'image/jpeg', |
||
| 481 | 'jpg2' => 'image/jp2', |
||
| 482 | 'jpgm' => 'video/jpm', |
||
| 483 | 'jpgv' => 'video/jpeg', |
||
| 484 | 'jph' => 'image/jph', |
||
| 485 | 'jpm' => 'video/jpm', |
||
| 486 | 'jpx' => 'image/jpx', |
||
| 487 | 'js' => 'application/javascript', |
||
| 488 | 'json' => 'application/json', |
||
| 489 | 'json5' => 'application/json5', |
||
| 490 | 'jsonld' => 'application/ld+json', |
||
| 491 | 'jsonml' => 'application/jsonml+json', |
||
| 492 | 'jsx' => 'text/jsx', |
||
| 493 | 'jxr' => 'image/jxr', |
||
| 494 | 'jxra' => 'image/jxra', |
||
| 495 | 'jxrs' => 'image/jxrs', |
||
| 496 | 'jxs' => 'image/jxs', |
||
| 497 | 'jxsc' => 'image/jxsc', |
||
| 498 | 'jxsi' => 'image/jxsi', |
||
| 499 | 'jxss' => 'image/jxss', |
||
| 500 | 'kar' => 'audio/midi', |
||
| 501 | 'karbon' => 'application/vnd.kde.karbon', |
||
| 502 | 'kdb' => 'application/octet-stream', |
||
| 503 | 'kdbx' => 'application/x-keepass2', |
||
| 504 | 'key' => 'application/vnd.apple.keynote', |
||
| 505 | 'kfo' => 'application/vnd.kde.kformula', |
||
| 506 | 'kia' => 'application/vnd.kidspiration', |
||
| 507 | 'kml' => 'application/vnd.google-earth.kml+xml', |
||
| 508 | 'kmz' => 'application/vnd.google-earth.kmz', |
||
| 509 | 'kne' => 'application/vnd.kinar', |
||
| 510 | 'knp' => 'application/vnd.kinar', |
||
| 511 | 'kon' => 'application/vnd.kde.kontour', |
||
| 512 | 'kpr' => 'application/vnd.kde.kpresenter', |
||
| 513 | 'kpt' => 'application/vnd.kde.kpresenter', |
||
| 514 | 'kpxx' => 'application/vnd.ds-keypoint', |
||
| 515 | 'ksp' => 'application/vnd.kde.kspread', |
||
| 516 | 'ktr' => 'application/vnd.kahootz', |
||
| 517 | 'ktx' => 'image/ktx', |
||
| 518 | 'ktz' => 'application/vnd.kahootz', |
||
| 519 | 'kwd' => 'application/vnd.kde.kword', |
||
| 520 | 'kwt' => 'application/vnd.kde.kword', |
||
| 521 | 'lasxml' => 'application/vnd.las.las+xml', |
||
| 522 | 'latex' => 'application/x-latex', |
||
| 523 | 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', |
||
| 524 | 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', |
||
| 525 | 'les' => 'application/vnd.hhe.lesson-player', |
||
| 526 | 'less' => 'text/less', |
||
| 527 | 'lgr' => 'application/lgr+xml', |
||
| 528 | 'lha' => 'application/octet-stream', |
||
| 529 | 'link66' => 'application/vnd.route66.link66+xml', |
||
| 530 | 'list' => 'text/plain', |
||
| 531 | 'list3820' => 'application/vnd.ibm.modcap', |
||
| 532 | 'listafp' => 'application/vnd.ibm.modcap', |
||
| 533 | 'litcoffee' => 'text/coffeescript', |
||
| 534 | 'lnk' => 'application/x-ms-shortcut', |
||
| 535 | 'log' => 'text/plain', |
||
| 536 | 'lostxml' => 'application/lost+xml', |
||
| 537 | 'lrf' => 'application/octet-stream', |
||
| 538 | 'lrm' => 'application/vnd.ms-lrm', |
||
| 539 | 'ltf' => 'application/vnd.frogans.ltf', |
||
| 540 | 'lua' => 'text/x-lua', |
||
| 541 | 'luac' => 'application/x-lua-bytecode', |
||
| 542 | 'lvp' => 'audio/vnd.lucent.voice', |
||
| 543 | 'lwp' => 'application/vnd.lotus-wordpro', |
||
| 544 | 'lzh' => 'application/octet-stream', |
||
| 545 | 'm1v' => 'video/mpeg', |
||
| 546 | 'm2a' => 'audio/mpeg', |
||
| 547 | 'm2v' => 'video/mpeg', |
||
| 548 | 'm3a' => 'audio/mpeg', |
||
| 549 | 'm3u' => 'text/plain', |
||
| 550 | 'm3u8' => 'application/vnd.apple.mpegurl', |
||
| 551 | 'm4a' => 'audio/x-m4a', |
||
| 552 | 'm4p' => 'application/mp4', |
||
| 553 | 'm4u' => 'application/vnd.mpegurl', |
||
| 554 | 'm4v' => 'video/x-m4v', |
||
| 555 | 'm13' => 'application/x-msmediaview', |
||
| 556 | 'm14' => 'application/x-msmediaview', |
||
| 557 | 'm21' => 'application/mp21', |
||
| 558 | 'ma' => 'application/mathematica', |
||
| 559 | 'mads' => 'application/mads+xml', |
||
| 560 | 'maei' => 'application/mmt-aei+xml', |
||
| 561 | 'mag' => 'application/vnd.ecowin.chart', |
||
| 562 | 'maker' => 'application/vnd.framemaker', |
||
| 563 | 'man' => 'text/troff', |
||
| 564 | 'manifest' => 'text/cache-manifest', |
||
| 565 | 'map' => 'application/json', |
||
| 566 | 'mar' => 'application/octet-stream', |
||
| 567 | 'markdown' => 'text/markdown', |
||
| 568 | 'mathml' => 'application/mathml+xml', |
||
| 569 | 'mb' => 'application/mathematica', |
||
| 570 | 'mbk' => 'application/vnd.mobius.mbk', |
||
| 571 | 'mbox' => 'application/mbox', |
||
| 572 | 'mc1' => 'application/vnd.medcalcdata', |
||
| 573 | 'mcd' => 'application/vnd.mcd', |
||
| 574 | 'mcurl' => 'text/vnd.curl.mcurl', |
||
| 575 | 'md' => 'text/markdown', |
||
| 576 | 'mdb' => 'application/x-msaccess', |
||
| 577 | 'mdi' => 'image/vnd.ms-modi', |
||
| 578 | 'mdx' => 'text/mdx', |
||
| 579 | 'me' => 'text/troff', |
||
| 580 | 'mesh' => 'model/mesh', |
||
| 581 | 'meta4' => 'application/metalink4+xml', |
||
| 582 | 'metalink' => 'application/metalink+xml', |
||
| 583 | 'mets' => 'application/mets+xml', |
||
| 584 | 'mfm' => 'application/vnd.mfmp', |
||
| 585 | 'mft' => 'application/rpki-manifest', |
||
| 586 | 'mgp' => 'application/vnd.osgeo.mapguide.package', |
||
| 587 | 'mgz' => 'application/vnd.proteus.magazine', |
||
| 588 | 'mid' => 'audio/midi', |
||
| 589 | 'midi' => 'audio/midi', |
||
| 590 | 'mie' => 'application/x-mie', |
||
| 591 | 'mif' => 'application/vnd.mif', |
||
| 592 | 'mime' => 'message/rfc822', |
||
| 593 | 'mj2' => 'video/mj2', |
||
| 594 | 'mjp2' => 'video/mj2', |
||
| 595 | 'mjs' => 'application/javascript', |
||
| 596 | 'mk3d' => 'video/x-matroska', |
||
| 597 | 'mka' => 'audio/x-matroska', |
||
| 598 | 'mkd' => 'text/x-markdown', |
||
| 599 | 'mks' => 'video/x-matroska', |
||
| 600 | 'mkv' => 'video/x-matroska', |
||
| 601 | 'mlp' => 'application/vnd.dolby.mlp', |
||
| 602 | 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', |
||
| 603 | 'mmf' => 'application/vnd.smaf', |
||
| 604 | 'mml' => 'text/mathml', |
||
| 605 | 'mmr' => 'image/vnd.fujixerox.edmics-mmr', |
||
| 606 | 'mng' => 'video/x-mng', |
||
| 607 | 'mny' => 'application/x-msmoney', |
||
| 608 | 'mobi' => 'application/x-mobipocket-ebook', |
||
| 609 | 'mods' => 'application/mods+xml', |
||
| 610 | 'mov' => 'video/quicktime', |
||
| 611 | 'movie' => 'video/x-sgi-movie', |
||
| 612 | 'mp2' => 'audio/mpeg', |
||
| 613 | 'mp2a' => 'audio/mpeg', |
||
| 614 | 'mp3' => 'audio/mpeg', |
||
| 615 | 'mp4' => 'video/mp4', |
||
| 616 | 'mp4a' => 'audio/mp4', |
||
| 617 | 'mp4s' => 'application/mp4', |
||
| 618 | 'mp4v' => 'video/mp4', |
||
| 619 | 'mp21' => 'application/mp21', |
||
| 620 | 'mpc' => 'application/vnd.mophun.certificate', |
||
| 621 | 'mpd' => 'application/dash+xml', |
||
| 622 | 'mpe' => 'video/mpeg', |
||
| 623 | 'mpeg' => 'video/mpeg', |
||
| 624 | 'mpg' => 'video/mpeg', |
||
| 625 | 'mpg4' => 'video/mp4', |
||
| 626 | 'mpga' => 'audio/mpeg', |
||
| 627 | 'mpkg' => 'application/vnd.apple.installer+xml', |
||
| 628 | 'mpm' => 'application/vnd.blueice.multipass', |
||
| 629 | 'mpn' => 'application/vnd.mophun.application', |
||
| 630 | 'mpp' => 'application/vnd.ms-project', |
||
| 631 | 'mpt' => 'application/vnd.ms-project', |
||
| 632 | 'mpy' => 'application/vnd.ibm.minipay', |
||
| 633 | 'mqy' => 'application/vnd.mobius.mqy', |
||
| 634 | 'mrc' => 'application/marc', |
||
| 635 | 'mrcx' => 'application/marcxml+xml', |
||
| 636 | 'ms' => 'text/troff', |
||
| 637 | 'mscml' => 'application/mediaservercontrol+xml', |
||
| 638 | 'mseed' => 'application/vnd.fdsn.mseed', |
||
| 639 | 'mseq' => 'application/vnd.mseq', |
||
| 640 | 'msf' => 'application/vnd.epson.msf', |
||
| 641 | 'msg' => 'application/vnd.ms-outlook', |
||
| 642 | 'msh' => 'model/mesh', |
||
| 643 | 'msi' => 'application/x-msdownload', |
||
| 644 | 'msl' => 'application/vnd.mobius.msl', |
||
| 645 | 'msm' => 'application/octet-stream', |
||
| 646 | 'msp' => 'application/octet-stream', |
||
| 647 | 'msty' => 'application/vnd.muvee.style', |
||
| 648 | 'mtl' => 'model/mtl', |
||
| 649 | 'mts' => 'model/vnd.mts', |
||
| 650 | 'mus' => 'application/vnd.musician', |
||
| 651 | 'musd' => 'application/mmt-usd+xml', |
||
| 652 | 'musicxml' => 'application/vnd.recordare.musicxml+xml', |
||
| 653 | 'mvb' => 'application/x-msmediaview', |
||
| 654 | 'mwf' => 'application/vnd.mfer', |
||
| 655 | 'mxf' => 'application/mxf', |
||
| 656 | 'mxl' => 'application/vnd.recordare.musicxml', |
||
| 657 | 'mxmf' => 'audio/mobile-xmf', |
||
| 658 | 'mxml' => 'application/xv+xml', |
||
| 659 | 'mxs' => 'application/vnd.triscape.mxs', |
||
| 660 | 'mxu' => 'video/vnd.mpegurl', |
||
| 661 | 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', |
||
| 662 | 'n3' => 'text/n3', |
||
| 663 | 'nb' => 'application/mathematica', |
||
| 664 | 'nbp' => 'application/vnd.wolfram.player', |
||
| 665 | 'nc' => 'application/x-netcdf', |
||
| 666 | 'ncx' => 'application/x-dtbncx+xml', |
||
| 667 | 'nfo' => 'text/x-nfo', |
||
| 668 | 'ngdat' => 'application/vnd.nokia.n-gage.data', |
||
| 669 | 'nitf' => 'application/vnd.nitf', |
||
| 670 | 'nlu' => 'application/vnd.neurolanguage.nlu', |
||
| 671 | 'nml' => 'application/vnd.enliven', |
||
| 672 | 'nnd' => 'application/vnd.noblenet-directory', |
||
| 673 | 'nns' => 'application/vnd.noblenet-sealer', |
||
| 674 | 'nnw' => 'application/vnd.noblenet-web', |
||
| 675 | 'npx' => 'image/vnd.net-fpx', |
||
| 676 | 'nq' => 'application/n-quads', |
||
| 677 | 'nsc' => 'application/x-conference', |
||
| 678 | 'nsf' => 'application/vnd.lotus-notes', |
||
| 679 | 'nt' => 'application/n-triples', |
||
| 680 | 'ntf' => 'application/vnd.nitf', |
||
| 681 | 'numbers' => 'application/vnd.apple.numbers', |
||
| 682 | 'nzb' => 'application/x-nzb', |
||
| 683 | 'oa2' => 'application/vnd.fujitsu.oasys2', |
||
| 684 | 'oa3' => 'application/vnd.fujitsu.oasys3', |
||
| 685 | 'oas' => 'application/vnd.fujitsu.oasys', |
||
| 686 | 'obd' => 'application/x-msbinder', |
||
| 687 | 'obgx' => 'application/vnd.openblox.game+xml', |
||
| 688 | 'obj' => 'model/obj', |
||
| 689 | 'oda' => 'application/oda', |
||
| 690 | 'odb' => 'application/vnd.oasis.opendocument.database', |
||
| 691 | 'odc' => 'application/vnd.oasis.opendocument.chart', |
||
| 692 | 'odf' => 'application/vnd.oasis.opendocument.formula', |
||
| 693 | 'odft' => 'application/vnd.oasis.opendocument.formula-template', |
||
| 694 | 'odg' => 'application/vnd.oasis.opendocument.graphics', |
||
| 695 | 'odi' => 'application/vnd.oasis.opendocument.image', |
||
| 696 | 'odm' => 'application/vnd.oasis.opendocument.text-master', |
||
| 697 | 'odp' => 'application/vnd.oasis.opendocument.presentation', |
||
| 698 | 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', |
||
| 699 | 'odt' => 'application/vnd.oasis.opendocument.text', |
||
| 700 | 'oga' => 'audio/ogg', |
||
| 701 | 'ogex' => 'model/vnd.opengex', |
||
| 702 | 'ogg' => 'audio/ogg', |
||
| 703 | 'ogv' => 'video/ogg', |
||
| 704 | 'ogx' => 'application/ogg', |
||
| 705 | 'omdoc' => 'application/omdoc+xml', |
||
| 706 | 'onepkg' => 'application/onenote', |
||
| 707 | 'onetmp' => 'application/onenote', |
||
| 708 | 'onetoc' => 'application/onenote', |
||
| 709 | 'onetoc2' => 'application/onenote', |
||
| 710 | 'opf' => 'application/oebps-package+xml', |
||
| 711 | 'opml' => 'text/x-opml', |
||
| 712 | 'oprc' => 'application/vnd.palm', |
||
| 713 | 'org' => 'text/x-org', |
||
| 714 | 'osf' => 'application/vnd.yamaha.openscoreformat', |
||
| 715 | 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', |
||
| 716 | 'osm' => 'application/vnd.openstreetmap.data+xml', |
||
| 717 | 'otc' => 'application/vnd.oasis.opendocument.chart-template', |
||
| 718 | 'otf' => 'font/otf', |
||
| 719 | 'otg' => 'application/vnd.oasis.opendocument.graphics-template', |
||
| 720 | 'oth' => 'application/vnd.oasis.opendocument.text-web', |
||
| 721 | 'oti' => 'application/vnd.oasis.opendocument.image-template', |
||
| 722 | 'otp' => 'application/vnd.oasis.opendocument.presentation-template', |
||
| 723 | 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', |
||
| 724 | 'ott' => 'application/vnd.oasis.opendocument.text-template', |
||
| 725 | 'ova' => 'application/x-virtualbox-ova', |
||
| 726 | 'ovf' => 'application/x-virtualbox-ovf', |
||
| 727 | 'owl' => 'application/rdf+xml', |
||
| 728 | 'oxps' => 'application/oxps', |
||
| 729 | 'oxt' => 'application/vnd.openofficeorg.extension', |
||
| 730 | 'p' => 'text/x-pascal', |
||
| 731 | 'p7a' => 'application/x-pkcs7-signature', |
||
| 732 | 'p7b' => 'application/x-pkcs7-certificates', |
||
| 733 | 'p7c' => 'application/pkcs7-mime', |
||
| 734 | 'p7m' => 'application/pkcs7-mime', |
||
| 735 | 'p7r' => 'application/x-pkcs7-certreqresp', |
||
| 736 | 'p7s' => 'application/pkcs7-signature', |
||
| 737 | 'p8' => 'application/pkcs8', |
||
| 738 | 'p10' => 'application/x-pkcs10', |
||
| 739 | 'p12' => 'application/x-pkcs12', |
||
| 740 | 'pac' => 'application/x-ns-proxy-autoconfig', |
||
| 741 | 'pages' => 'application/vnd.apple.pages', |
||
| 742 | 'pas' => 'text/x-pascal', |
||
| 743 | 'paw' => 'application/vnd.pawaafile', |
||
| 744 | 'pbd' => 'application/vnd.powerbuilder6', |
||
| 745 | 'pbm' => 'image/x-portable-bitmap', |
||
| 746 | 'pcap' => 'application/vnd.tcpdump.pcap', |
||
| 747 | 'pcf' => 'application/x-font-pcf', |
||
| 748 | 'pcl' => 'application/vnd.hp-pcl', |
||
| 749 | 'pclxl' => 'application/vnd.hp-pclxl', |
||
| 750 | 'pct' => 'image/x-pict', |
||
| 751 | 'pcurl' => 'application/vnd.curl.pcurl', |
||
| 752 | 'pcx' => 'image/x-pcx', |
||
| 753 | 'pdb' => 'application/x-pilot', |
||
| 754 | 'pde' => 'text/x-processing', |
||
| 755 | 'pdf' => 'application/pdf', |
||
| 756 | 'pem' => 'application/x-x509-user-cert', |
||
| 757 | 'pfa' => 'application/x-font-type1', |
||
| 758 | 'pfb' => 'application/x-font-type1', |
||
| 759 | 'pfm' => 'application/x-font-type1', |
||
| 760 | 'pfr' => 'application/font-tdpfr', |
||
| 761 | 'pfx' => 'application/x-pkcs12', |
||
| 762 | 'pgm' => 'image/x-portable-graymap', |
||
| 763 | 'pgn' => 'application/x-chess-pgn', |
||
| 764 | 'pgp' => 'application/pgp', |
||
| 765 | 'php' => 'application/x-httpd-php', |
||
| 766 | 'php3' => 'application/x-httpd-php', |
||
| 767 | 'php4' => 'application/x-httpd-php', |
||
| 768 | 'phps' => 'application/x-httpd-php-source', |
||
| 769 | 'phtml' => 'application/x-httpd-php', |
||
| 770 | 'pic' => 'image/x-pict', |
||
| 771 | 'pkg' => 'application/octet-stream', |
||
| 772 | 'pki' => 'application/pkixcmp', |
||
| 773 | 'pkipath' => 'application/pkix-pkipath', |
||
| 774 | 'pkpass' => 'application/vnd.apple.pkpass', |
||
| 775 | 'pl' => 'application/x-perl', |
||
| 776 | 'plb' => 'application/vnd.3gpp.pic-bw-large', |
||
| 777 | 'plc' => 'application/vnd.mobius.plc', |
||
| 778 | 'plf' => 'application/vnd.pocketlearn', |
||
| 779 | 'pls' => 'application/pls+xml', |
||
| 780 | 'pm' => 'application/x-perl', |
||
| 781 | 'pml' => 'application/vnd.ctc-posml', |
||
| 782 | 'png' => 'image/png', |
||
| 783 | 'pnm' => 'image/x-portable-anymap', |
||
| 784 | 'portpkg' => 'application/vnd.macports.portpkg', |
||
| 785 | 'pot' => 'application/vnd.ms-powerpoint', |
||
| 786 | 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', |
||
| 787 | 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', |
||
| 788 | 'ppa' => 'application/vnd.ms-powerpoint', |
||
| 789 | 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', |
||
| 790 | 'ppd' => 'application/vnd.cups-ppd', |
||
| 791 | 'ppm' => 'image/x-portable-pixmap', |
||
| 792 | 'pps' => 'application/vnd.ms-powerpoint', |
||
| 793 | 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', |
||
| 794 | 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', |
||
| 795 | 'ppt' => 'application/powerpoint', |
||
| 796 | 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', |
||
| 797 | 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', |
||
| 798 | 'pqa' => 'application/vnd.palm', |
||
| 799 | 'prc' => 'application/x-pilot', |
||
| 800 | 'pre' => 'application/vnd.lotus-freelance', |
||
| 801 | 'prf' => 'application/pics-rules', |
||
| 802 | 'provx' => 'application/provenance+xml', |
||
| 803 | 'ps' => 'application/postscript', |
||
| 804 | 'psb' => 'application/vnd.3gpp.pic-bw-small', |
||
| 805 | 'psd' => 'application/x-photoshop', |
||
| 806 | 'psf' => 'application/x-font-linux-psf', |
||
| 807 | 'pskcxml' => 'application/pskc+xml', |
||
| 808 | 'pti' => 'image/prs.pti', |
||
| 809 | 'ptid' => 'application/vnd.pvi.ptid1', |
||
| 810 | 'pub' => 'application/x-mspublisher', |
||
| 811 | 'pvb' => 'application/vnd.3gpp.pic-bw-var', |
||
| 812 | 'pwn' => 'application/vnd.3m.post-it-notes', |
||
| 813 | 'pya' => 'audio/vnd.ms-playready.media.pya', |
||
| 814 | 'pyv' => 'video/vnd.ms-playready.media.pyv', |
||
| 815 | 'qam' => 'application/vnd.epson.quickanime', |
||
| 816 | 'qbo' => 'application/vnd.intu.qbo', |
||
| 817 | 'qfx' => 'application/vnd.intu.qfx', |
||
| 818 | 'qps' => 'application/vnd.publishare-delta-tree', |
||
| 819 | 'qt' => 'video/quicktime', |
||
| 820 | 'qwd' => 'application/vnd.quark.quarkxpress', |
||
| 821 | 'qwt' => 'application/vnd.quark.quarkxpress', |
||
| 822 | 'qxb' => 'application/vnd.quark.quarkxpress', |
||
| 823 | 'qxd' => 'application/vnd.quark.quarkxpress', |
||
| 824 | 'qxl' => 'application/vnd.quark.quarkxpress', |
||
| 825 | 'qxt' => 'application/vnd.quark.quarkxpress', |
||
| 826 | 'ra' => 'audio/x-realaudio', |
||
| 827 | 'ram' => 'audio/x-pn-realaudio', |
||
| 828 | 'raml' => 'application/raml+yaml', |
||
| 829 | 'rapd' => 'application/route-apd+xml', |
||
| 830 | 'rar' => 'application/x-rar', |
||
| 831 | 'ras' => 'image/x-cmu-raster', |
||
| 832 | 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', |
||
| 833 | 'rdf' => 'application/rdf+xml', |
||
| 834 | 'rdz' => 'application/vnd.data-vision.rdz', |
||
| 835 | 'relo' => 'application/p2p-overlay+xml', |
||
| 836 | 'rep' => 'application/vnd.businessobjects', |
||
| 837 | 'res' => 'application/x-dtbresource+xml', |
||
| 838 | 'rgb' => 'image/x-rgb', |
||
| 839 | 'rif' => 'application/reginfo+xml', |
||
| 840 | 'rip' => 'audio/vnd.rip', |
||
| 841 | 'ris' => 'application/x-research-info-systems', |
||
| 842 | 'rl' => 'application/resource-lists+xml', |
||
| 843 | 'rlc' => 'image/vnd.fujixerox.edmics-rlc', |
||
| 844 | 'rld' => 'application/resource-lists-diff+xml', |
||
| 845 | 'rm' => 'audio/x-pn-realaudio', |
||
| 846 | 'rmi' => 'audio/midi', |
||
| 847 | 'rmp' => 'audio/x-pn-realaudio-plugin', |
||
| 848 | 'rms' => 'application/vnd.jcp.javame.midlet-rms', |
||
| 849 | 'rmvb' => 'application/vnd.rn-realmedia-vbr', |
||
| 850 | 'rnc' => 'application/relax-ng-compact-syntax', |
||
| 851 | 'rng' => 'application/xml', |
||
| 852 | 'roa' => 'application/rpki-roa', |
||
| 853 | 'roff' => 'text/troff', |
||
| 854 | 'rp9' => 'application/vnd.cloanto.rp9', |
||
| 855 | 'rpm' => 'audio/x-pn-realaudio-plugin', |
||
| 856 | 'rpss' => 'application/vnd.nokia.radio-presets', |
||
| 857 | 'rpst' => 'application/vnd.nokia.radio-preset', |
||
| 858 | 'rq' => 'application/sparql-query', |
||
| 859 | 'rs' => 'application/rls-services+xml', |
||
| 860 | 'rsa' => 'application/x-pkcs7', |
||
| 861 | 'rsat' => 'application/atsc-rsat+xml', |
||
| 862 | 'rsd' => 'application/rsd+xml', |
||
| 863 | 'rsheet' => 'application/urc-ressheet+xml', |
||
| 864 | 'rss' => 'application/rss+xml', |
||
| 865 | 'rtf' => 'text/rtf', |
||
| 866 | 'rtx' => 'text/richtext', |
||
| 867 | 'run' => 'application/x-makeself', |
||
| 868 | 'rusd' => 'application/route-usd+xml', |
||
| 869 | 'rv' => 'video/vnd.rn-realvideo', |
||
| 870 | 's' => 'text/x-asm', |
||
| 871 | 's3m' => 'audio/s3m', |
||
| 872 | 'saf' => 'application/vnd.yamaha.smaf-audio', |
||
| 873 | 'sass' => 'text/x-sass', |
||
| 874 | 'sbml' => 'application/sbml+xml', |
||
| 875 | 'sc' => 'application/vnd.ibm.secure-container', |
||
| 876 | 'scd' => 'application/x-msschedule', |
||
| 877 | 'scm' => 'application/vnd.lotus-screencam', |
||
| 878 | 'scq' => 'application/scvp-cv-request', |
||
| 879 | 'scs' => 'application/scvp-cv-response', |
||
| 880 | 'scss' => 'text/x-scss', |
||
| 881 | 'scurl' => 'text/vnd.curl.scurl', |
||
| 882 | 'sda' => 'application/vnd.stardivision.draw', |
||
| 883 | 'sdc' => 'application/vnd.stardivision.calc', |
||
| 884 | 'sdd' => 'application/vnd.stardivision.impress', |
||
| 885 | 'sdkd' => 'application/vnd.solent.sdkm+xml', |
||
| 886 | 'sdkm' => 'application/vnd.solent.sdkm+xml', |
||
| 887 | 'sdp' => 'application/sdp', |
||
| 888 | 'sdw' => 'application/vnd.stardivision.writer', |
||
| 889 | 'sea' => 'application/octet-stream', |
||
| 890 | 'see' => 'application/vnd.seemail', |
||
| 891 | 'seed' => 'application/vnd.fdsn.seed', |
||
| 892 | 'sema' => 'application/vnd.sema', |
||
| 893 | 'semd' => 'application/vnd.semd', |
||
| 894 | 'semf' => 'application/vnd.semf', |
||
| 895 | 'senmlx' => 'application/senml+xml', |
||
| 896 | 'sensmlx' => 'application/sensml+xml', |
||
| 897 | 'ser' => 'application/java-serialized-object', |
||
| 898 | 'setpay' => 'application/set-payment-initiation', |
||
| 899 | 'setreg' => 'application/set-registration-initiation', |
||
| 900 | 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', |
||
| 901 | 'sfs' => 'application/vnd.spotfire.sfs', |
||
| 902 | 'sfv' => 'text/x-sfv', |
||
| 903 | 'sgi' => 'image/sgi', |
||
| 904 | 'sgl' => 'application/vnd.stardivision.writer-global', |
||
| 905 | 'sgm' => 'text/sgml', |
||
| 906 | 'sgml' => 'text/sgml', |
||
| 907 | 'sh' => 'application/x-sh', |
||
| 908 | 'shar' => 'application/x-shar', |
||
| 909 | 'shex' => 'text/shex', |
||
| 910 | 'shf' => 'application/shf+xml', |
||
| 911 | 'shtml' => 'text/html', |
||
| 912 | 'sid' => 'image/x-mrsid-image', |
||
| 913 | 'sieve' => 'application/sieve', |
||
| 914 | 'sig' => 'application/pgp-signature', |
||
| 915 | 'sil' => 'audio/silk', |
||
| 916 | 'silo' => 'model/mesh', |
||
| 917 | 'sis' => 'application/vnd.symbian.install', |
||
| 918 | 'sisx' => 'application/vnd.symbian.install', |
||
| 919 | 'sit' => 'application/x-stuffit', |
||
| 920 | 'sitx' => 'application/x-stuffitx', |
||
| 921 | 'siv' => 'application/sieve', |
||
| 922 | 'skd' => 'application/vnd.koan', |
||
| 923 | 'skm' => 'application/vnd.koan', |
||
| 924 | 'skp' => 'application/vnd.koan', |
||
| 925 | 'skt' => 'application/vnd.koan', |
||
| 926 | 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', |
||
| 927 | 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', |
||
| 928 | 'slim' => 'text/slim', |
||
| 929 | 'slm' => 'text/slim', |
||
| 930 | 'sls' => 'application/route-s-tsid+xml', |
||
| 931 | 'slt' => 'application/vnd.epson.salt', |
||
| 932 | 'sm' => 'application/vnd.stepmania.stepchart', |
||
| 933 | 'smf' => 'application/vnd.stardivision.math', |
||
| 934 | 'smi' => 'application/smil', |
||
| 935 | 'smil' => 'application/smil', |
||
| 936 | 'smv' => 'video/x-smv', |
||
| 937 | 'smzip' => 'application/vnd.stepmania.package', |
||
| 938 | 'snd' => 'audio/basic', |
||
| 939 | 'snf' => 'application/x-font-snf', |
||
| 940 | 'so' => 'application/octet-stream', |
||
| 941 | 'spc' => 'application/x-pkcs7-certificates', |
||
| 942 | 'spdx' => 'text/spdx', |
||
| 943 | 'spf' => 'application/vnd.yamaha.smaf-phrase', |
||
| 944 | 'spl' => 'application/x-futuresplash', |
||
| 945 | 'spot' => 'text/vnd.in3d.spot', |
||
| 946 | 'spp' => 'application/scvp-vp-response', |
||
| 947 | 'spq' => 'application/scvp-vp-request', |
||
| 948 | 'spx' => 'audio/ogg', |
||
| 949 | 'sql' => 'application/x-sql', |
||
| 950 | 'src' => 'application/x-wais-source', |
||
| 951 | 'srt' => 'application/x-subrip', |
||
| 952 | 'sru' => 'application/sru+xml', |
||
| 953 | 'srx' => 'application/sparql-results+xml', |
||
| 954 | 'ssdl' => 'application/ssdl+xml', |
||
| 955 | 'sse' => 'application/vnd.kodak-descriptor', |
||
| 956 | 'ssf' => 'application/vnd.epson.ssf', |
||
| 957 | 'ssml' => 'application/ssml+xml', |
||
| 958 | 'sst' => 'application/octet-stream', |
||
| 959 | 'st' => 'application/vnd.sailingtracker.track', |
||
| 960 | 'stc' => 'application/vnd.sun.xml.calc.template', |
||
| 961 | 'std' => 'application/vnd.sun.xml.draw.template', |
||
| 962 | 'stf' => 'application/vnd.wt.stf', |
||
| 963 | 'sti' => 'application/vnd.sun.xml.impress.template', |
||
| 964 | 'stk' => 'application/hyperstudio', |
||
| 965 | 'stl' => 'model/stl', |
||
| 966 | 'str' => 'application/vnd.pg.format', |
||
| 967 | 'stw' => 'application/vnd.sun.xml.writer.template', |
||
| 968 | 'styl' => 'text/stylus', |
||
| 969 | 'stylus' => 'text/stylus', |
||
| 970 | 'sub' => 'text/vnd.dvb.subtitle', |
||
| 971 | 'sus' => 'application/vnd.sus-calendar', |
||
| 972 | 'susp' => 'application/vnd.sus-calendar', |
||
| 973 | 'sv4cpio' => 'application/x-sv4cpio', |
||
| 974 | 'sv4crc' => 'application/x-sv4crc', |
||
| 975 | 'svc' => 'application/vnd.dvb.service', |
||
| 976 | 'svd' => 'application/vnd.svd', |
||
| 977 | 'svg' => 'image/svg+xml', |
||
| 978 | 'svgz' => 'image/svg+xml', |
||
| 979 | 'swa' => 'application/x-director', |
||
| 980 | 'swf' => 'application/x-shockwave-flash', |
||
| 981 | 'swi' => 'application/vnd.aristanetworks.swi', |
||
| 982 | 'swidtag' => 'application/swid+xml', |
||
| 983 | 'sxc' => 'application/vnd.sun.xml.calc', |
||
| 984 | 'sxd' => 'application/vnd.sun.xml.draw', |
||
| 985 | 'sxg' => 'application/vnd.sun.xml.writer.global', |
||
| 986 | 'sxi' => 'application/vnd.sun.xml.impress', |
||
| 987 | 'sxm' => 'application/vnd.sun.xml.math', |
||
| 988 | 'sxw' => 'application/vnd.sun.xml.writer', |
||
| 989 | 't' => 'text/troff', |
||
| 990 | 't3' => 'application/x-t3vm-image', |
||
| 991 | 't38' => 'image/t38', |
||
| 992 | 'taglet' => 'application/vnd.mynfc', |
||
| 993 | 'tao' => 'application/vnd.tao.intent-module-archive', |
||
| 994 | 'tap' => 'image/vnd.tencent.tap', |
||
| 995 | 'tar' => 'application/x-tar', |
||
| 996 | 'tcap' => 'application/vnd.3gpp2.tcap', |
||
| 997 | 'tcl' => 'application/x-tcl', |
||
| 998 | 'td' => 'application/urc-targetdesc+xml', |
||
| 999 | 'teacher' => 'application/vnd.smart.teacher', |
||
| 1000 | 'tei' => 'application/tei+xml', |
||
| 1001 | 'teicorpus' => 'application/tei+xml', |
||
| 1002 | 'tex' => 'application/x-tex', |
||
| 1003 | 'texi' => 'application/x-texinfo', |
||
| 1004 | 'texinfo' => 'application/x-texinfo', |
||
| 1005 | 'text' => 'text/plain', |
||
| 1006 | 'tfi' => 'application/thraud+xml', |
||
| 1007 | 'tfm' => 'application/x-tex-tfm', |
||
| 1008 | 'tfx' => 'image/tiff-fx', |
||
| 1009 | 'tga' => 'image/x-tga', |
||
| 1010 | 'tgz' => 'application/x-tar', |
||
| 1011 | 'thmx' => 'application/vnd.ms-officetheme', |
||
| 1012 | 'tif' => 'image/tiff', |
||
| 1013 | 'tiff' => 'image/tiff', |
||
| 1014 | 'tk' => 'application/x-tcl', |
||
| 1015 | 'tmo' => 'application/vnd.tmobile-livetv', |
||
| 1016 | 'toml' => 'application/toml', |
||
| 1017 | 'torrent' => 'application/x-bittorrent', |
||
| 1018 | 'tpl' => 'application/vnd.groove-tool-template', |
||
| 1019 | 'tpt' => 'application/vnd.trid.tpt', |
||
| 1020 | 'tr' => 'text/troff', |
||
| 1021 | 'tra' => 'application/vnd.trueapp', |
||
| 1022 | 'trm' => 'application/x-msterminal', |
||
| 1023 | 'ts' => 'video/mp2t', |
||
| 1024 | 'tsd' => 'application/timestamped-data', |
||
| 1025 | 'tsv' => 'text/tab-separated-values', |
||
| 1026 | 'ttc' => 'font/collection', |
||
| 1027 | 'ttf' => 'font/ttf', |
||
| 1028 | 'ttl' => 'text/turtle', |
||
| 1029 | 'ttml' => 'application/ttml+xml', |
||
| 1030 | 'twd' => 'application/vnd.simtech-mindmapper', |
||
| 1031 | 'twds' => 'application/vnd.simtech-mindmapper', |
||
| 1032 | 'txd' => 'application/vnd.genomatix.tuxedo', |
||
| 1033 | 'txf' => 'application/vnd.mobius.txf', |
||
| 1034 | 'txt' => 'text/plain', |
||
| 1035 | 'u8dsn' => 'message/global-delivery-status', |
||
| 1036 | 'u8hdr' => 'message/global-headers', |
||
| 1037 | 'u8mdn' => 'message/global-disposition-notification', |
||
| 1038 | 'u8msg' => 'message/global', |
||
| 1039 | 'u32' => 'application/x-authorware-bin', |
||
| 1040 | 'ubj' => 'application/ubjson', |
||
| 1041 | 'udeb' => 'application/x-debian-package', |
||
| 1042 | 'ufd' => 'application/vnd.ufdl', |
||
| 1043 | 'ufdl' => 'application/vnd.ufdl', |
||
| 1044 | 'ulx' => 'application/x-glulx', |
||
| 1045 | 'umj' => 'application/vnd.umajin', |
||
| 1046 | 'unityweb' => 'application/vnd.unity', |
||
| 1047 | 'uoml' => 'application/vnd.uoml+xml', |
||
| 1048 | 'uri' => 'text/uri-list', |
||
| 1049 | 'uris' => 'text/uri-list', |
||
| 1050 | 'urls' => 'text/uri-list', |
||
| 1051 | 'usdz' => 'model/vnd.usdz+zip', |
||
| 1052 | 'ustar' => 'application/x-ustar', |
||
| 1053 | 'utz' => 'application/vnd.uiq.theme', |
||
| 1054 | 'uu' => 'text/x-uuencode', |
||
| 1055 | 'uva' => 'audio/vnd.dece.audio', |
||
| 1056 | 'uvd' => 'application/vnd.dece.data', |
||
| 1057 | 'uvf' => 'application/vnd.dece.data', |
||
| 1058 | 'uvg' => 'image/vnd.dece.graphic', |
||
| 1059 | 'uvh' => 'video/vnd.dece.hd', |
||
| 1060 | 'uvi' => 'image/vnd.dece.graphic', |
||
| 1061 | 'uvm' => 'video/vnd.dece.mobile', |
||
| 1062 | 'uvp' => 'video/vnd.dece.pd', |
||
| 1063 | 'uvs' => 'video/vnd.dece.sd', |
||
| 1064 | 'uvt' => 'application/vnd.dece.ttml+xml', |
||
| 1065 | 'uvu' => 'video/vnd.uvvu.mp4', |
||
| 1066 | 'uvv' => 'video/vnd.dece.video', |
||
| 1067 | 'uvva' => 'audio/vnd.dece.audio', |
||
| 1068 | 'uvvd' => 'application/vnd.dece.data', |
||
| 1069 | 'uvvf' => 'application/vnd.dece.data', |
||
| 1070 | 'uvvg' => 'image/vnd.dece.graphic', |
||
| 1071 | 'uvvh' => 'video/vnd.dece.hd', |
||
| 1072 | 'uvvi' => 'image/vnd.dece.graphic', |
||
| 1073 | 'uvvm' => 'video/vnd.dece.mobile', |
||
| 1074 | 'uvvp' => 'video/vnd.dece.pd', |
||
| 1075 | 'uvvs' => 'video/vnd.dece.sd', |
||
| 1076 | 'uvvt' => 'application/vnd.dece.ttml+xml', |
||
| 1077 | 'uvvu' => 'video/vnd.uvvu.mp4', |
||
| 1078 | 'uvvv' => 'video/vnd.dece.video', |
||
| 1079 | 'uvvx' => 'application/vnd.dece.unspecified', |
||
| 1080 | 'uvvz' => 'application/vnd.dece.zip', |
||
| 1081 | 'uvx' => 'application/vnd.dece.unspecified', |
||
| 1082 | 'uvz' => 'application/vnd.dece.zip', |
||
| 1083 | 'vbox' => 'application/x-virtualbox-vbox', |
||
| 1084 | 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', |
||
| 1085 | 'vcard' => 'text/vcard', |
||
| 1086 | 'vcd' => 'application/x-cdlink', |
||
| 1087 | 'vcf' => 'text/x-vcard', |
||
| 1088 | 'vcg' => 'application/vnd.groove-vcard', |
||
| 1089 | 'vcs' => 'text/x-vcalendar', |
||
| 1090 | 'vcx' => 'application/vnd.vcx', |
||
| 1091 | 'vdi' => 'application/x-virtualbox-vdi', |
||
| 1092 | 'vhd' => 'application/x-virtualbox-vhd', |
||
| 1093 | 'vis' => 'application/vnd.visionary', |
||
| 1094 | 'viv' => 'video/vnd.vivo', |
||
| 1095 | 'vlc' => 'application/videolan', |
||
| 1096 | 'vmdk' => 'application/x-virtualbox-vmdk', |
||
| 1097 | 'vob' => 'video/x-ms-vob', |
||
| 1098 | 'vor' => 'application/vnd.stardivision.writer', |
||
| 1099 | 'vox' => 'application/x-authorware-bin', |
||
| 1100 | 'vrml' => 'model/vrml', |
||
| 1101 | 'vsd' => 'application/vnd.visio', |
||
| 1102 | 'vsf' => 'application/vnd.vsf', |
||
| 1103 | 'vss' => 'application/vnd.visio', |
||
| 1104 | 'vst' => 'application/vnd.visio', |
||
| 1105 | 'vsw' => 'application/vnd.visio', |
||
| 1106 | 'vtf' => 'image/vnd.valve.source.texture', |
||
| 1107 | 'vtt' => 'text/vtt', |
||
| 1108 | 'vtu' => 'model/vnd.vtu', |
||
| 1109 | 'vxml' => 'application/voicexml+xml', |
||
| 1110 | 'w3d' => 'application/x-director', |
||
| 1111 | 'wad' => 'application/x-doom', |
||
| 1112 | 'wadl' => 'application/vnd.sun.wadl+xml', |
||
| 1113 | 'war' => 'application/java-archive', |
||
| 1114 | 'wasm' => 'application/wasm', |
||
| 1115 | 'wav' => 'audio/x-wav', |
||
| 1116 | 'wax' => 'audio/x-ms-wax', |
||
| 1117 | 'wbmp' => 'image/vnd.wap.wbmp', |
||
| 1118 | 'wbs' => 'application/vnd.criticaltools.wbs+xml', |
||
| 1119 | 'wbxml' => 'application/wbxml', |
||
| 1120 | 'wcm' => 'application/vnd.ms-works', |
||
| 1121 | 'wdb' => 'application/vnd.ms-works', |
||
| 1122 | 'wdp' => 'image/vnd.ms-photo', |
||
| 1123 | 'weba' => 'audio/webm', |
||
| 1124 | 'webapp' => 'application/x-web-app-manifest+json', |
||
| 1125 | 'webm' => 'video/webm', |
||
| 1126 | 'webmanifest' => 'application/manifest+json', |
||
| 1127 | 'webp' => 'image/webp', |
||
| 1128 | 'wg' => 'application/vnd.pmi.widget', |
||
| 1129 | 'wgt' => 'application/widget', |
||
| 1130 | 'wks' => 'application/vnd.ms-works', |
||
| 1131 | 'wm' => 'video/x-ms-wm', |
||
| 1132 | 'wma' => 'audio/x-ms-wma', |
||
| 1133 | 'wmd' => 'application/x-ms-wmd', |
||
| 1134 | 'wmf' => 'image/wmf', |
||
| 1135 | 'wml' => 'text/vnd.wap.wml', |
||
| 1136 | 'wmlc' => 'application/wmlc', |
||
| 1137 | 'wmls' => 'text/vnd.wap.wmlscript', |
||
| 1138 | 'wmlsc' => 'application/vnd.wap.wmlscriptc', |
||
| 1139 | 'wmv' => 'video/x-ms-wmv', |
||
| 1140 | 'wmx' => 'video/x-ms-wmx', |
||
| 1141 | 'wmz' => 'application/x-msmetafile', |
||
| 1142 | 'woff' => 'font/woff', |
||
| 1143 | 'woff2' => 'font/woff2', |
||
| 1144 | 'word' => 'application/msword', |
||
| 1145 | 'wpd' => 'application/vnd.wordperfect', |
||
| 1146 | 'wpl' => 'application/vnd.ms-wpl', |
||
| 1147 | 'wps' => 'application/vnd.ms-works', |
||
| 1148 | 'wqd' => 'application/vnd.wqd', |
||
| 1149 | 'wri' => 'application/x-mswrite', |
||
| 1150 | 'wrl' => 'model/vrml', |
||
| 1151 | 'wsc' => 'message/vnd.wfa.wsc', |
||
| 1152 | 'wsdl' => 'application/wsdl+xml', |
||
| 1153 | 'wspolicy' => 'application/wspolicy+xml', |
||
| 1154 | 'wtb' => 'application/vnd.webturbo', |
||
| 1155 | 'wvx' => 'video/x-ms-wvx', |
||
| 1156 | 'x3d' => 'model/x3d+xml', |
||
| 1157 | 'x3db' => 'model/x3d+fastinfoset', |
||
| 1158 | 'x3dbz' => 'model/x3d+binary', |
||
| 1159 | 'x3dv' => 'model/x3d-vrml', |
||
| 1160 | 'x3dvz' => 'model/x3d+vrml', |
||
| 1161 | 'x3dz' => 'model/x3d+xml', |
||
| 1162 | 'x32' => 'application/x-authorware-bin', |
||
| 1163 | 'x_b' => 'model/vnd.parasolid.transmit.binary', |
||
| 1164 | 'x_t' => 'model/vnd.parasolid.transmit.text', |
||
| 1165 | 'xaml' => 'application/xaml+xml', |
||
| 1166 | 'xap' => 'application/x-silverlight-app', |
||
| 1167 | 'xar' => 'application/vnd.xara', |
||
| 1168 | 'xav' => 'application/xcap-att+xml', |
||
| 1169 | 'xbap' => 'application/x-ms-xbap', |
||
| 1170 | 'xbd' => 'application/vnd.fujixerox.docuworks.binder', |
||
| 1171 | 'xbm' => 'image/x-xbitmap', |
||
| 1172 | 'xca' => 'application/xcap-caps+xml', |
||
| 1173 | 'xcs' => 'application/calendar+xml', |
||
| 1174 | 'xdf' => 'application/xcap-diff+xml', |
||
| 1175 | 'xdm' => 'application/vnd.syncml.dm+xml', |
||
| 1176 | 'xdp' => 'application/vnd.adobe.xdp+xml', |
||
| 1177 | 'xdssc' => 'application/dssc+xml', |
||
| 1178 | 'xdw' => 'application/vnd.fujixerox.docuworks', |
||
| 1179 | 'xel' => 'application/xcap-el+xml', |
||
| 1180 | 'xenc' => 'application/xenc+xml', |
||
| 1181 | 'xer' => 'application/xcap-error+xml', |
||
| 1182 | 'xfdf' => 'application/vnd.adobe.xfdf', |
||
| 1183 | 'xfdl' => 'application/vnd.xfdl', |
||
| 1184 | 'xht' => 'application/xhtml+xml', |
||
| 1185 | 'xhtml' => 'application/xhtml+xml', |
||
| 1186 | 'xhvml' => 'application/xv+xml', |
||
| 1187 | 'xif' => 'image/vnd.xiff', |
||
| 1188 | 'xl' => 'application/excel', |
||
| 1189 | 'xla' => 'application/vnd.ms-excel', |
||
| 1190 | 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', |
||
| 1191 | 'xlc' => 'application/vnd.ms-excel', |
||
| 1192 | 'xlf' => 'application/xliff+xml', |
||
| 1193 | 'xlm' => 'application/vnd.ms-excel', |
||
| 1194 | 'xls' => 'application/vnd.ms-excel', |
||
| 1195 | 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', |
||
| 1196 | 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', |
||
| 1197 | 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', |
||
| 1198 | 'xlt' => 'application/vnd.ms-excel', |
||
| 1199 | 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', |
||
| 1200 | 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', |
||
| 1201 | 'xlw' => 'application/vnd.ms-excel', |
||
| 1202 | 'xm' => 'audio/xm', |
||
| 1203 | 'xml' => 'application/xml', |
||
| 1204 | 'xns' => 'application/xcap-ns+xml', |
||
| 1205 | 'xo' => 'application/vnd.olpc-sugar', |
||
| 1206 | 'xop' => 'application/xop+xml', |
||
| 1207 | 'xpi' => 'application/x-xpinstall', |
||
| 1208 | 'xpl' => 'application/xproc+xml', |
||
| 1209 | 'xpm' => 'image/x-xpixmap', |
||
| 1210 | 'xpr' => 'application/vnd.is-xpr', |
||
| 1211 | 'xps' => 'application/vnd.ms-xpsdocument', |
||
| 1212 | 'xpw' => 'application/vnd.intercon.formnet', |
||
| 1213 | 'xpx' => 'application/vnd.intercon.formnet', |
||
| 1214 | 'xsd' => 'application/xml', |
||
| 1215 | 'xsl' => 'application/xml', |
||
| 1216 | 'xslt' => 'application/xslt+xml', |
||
| 1217 | 'xsm' => 'application/vnd.syncml+xml', |
||
| 1218 | 'xspf' => 'application/xspf+xml', |
||
| 1219 | 'xul' => 'application/vnd.mozilla.xul+xml', |
||
| 1220 | 'xvm' => 'application/xv+xml', |
||
| 1221 | 'xvml' => 'application/xv+xml', |
||
| 1222 | 'xwd' => 'image/x-xwindowdump', |
||
| 1223 | 'xyz' => 'chemical/x-xyz', |
||
| 1224 | 'xz' => 'application/x-xz', |
||
| 1225 | 'yaml' => 'text/yaml', |
||
| 1226 | 'yang' => 'application/yang', |
||
| 1227 | 'yin' => 'application/yin+xml', |
||
| 1228 | 'yml' => 'text/yaml', |
||
| 1229 | 'ymp' => 'text/x-suse-ymp', |
||
| 1230 | 'z' => 'application/x-compress', |
||
| 1231 | 'z1' => 'application/x-zmachine', |
||
| 1232 | 'z2' => 'application/x-zmachine', |
||
| 1233 | 'z3' => 'application/x-zmachine', |
||
| 1234 | 'z4' => 'application/x-zmachine', |
||
| 1235 | 'z5' => 'application/x-zmachine', |
||
| 1236 | 'z6' => 'application/x-zmachine', |
||
| 1237 | 'z7' => 'application/x-zmachine', |
||
| 1238 | 'z8' => 'application/x-zmachine', |
||
| 1239 | 'zaz' => 'application/vnd.zzazz.deck+xml', |
||
| 1240 | 'zip' => 'application/x-zip', |
||
| 1241 | 'zir' => 'application/vnd.zul', |
||
| 1242 | 'zirz' => 'application/vnd.zul', |
||
| 1243 | 'zmm' => 'application/vnd.handheld-entertainment+xml', |
||
| 1244 | 'zsh' => 'text/x-scriptzsh', |
||
| 1245 | ]; |
||
| 1246 | |||
| 1247 | /** |
||
| 1248 | * List contents of a directory. |
||
| 1249 | * |
||
| 1250 | * @param string $directory The directory to list. |
||
| 1251 | * @param bool $recursive Whether to list recursively. |
||
| 1252 | * |
||
| 1253 | * @return array A list of file metadata. |
||
| 1254 | */ |
||
| 1255 | public static function listContents(string $directory = '', bool $recursive = false) : array |
||
| 1256 | { |
||
| 1257 | $result = []; |
||
| 1258 | |||
| 1259 | if (! is_dir($directory)) { |
||
| 1260 | return []; |
||
| 1261 | } |
||
| 1262 | |||
| 1263 | $iterator = $recursive ? self::getRecursiveDirectoryIterator($directory) : self::getDirectoryIterator($directory); |
||
| 1264 | |||
| 1265 | foreach ($iterator as $file) { |
||
| 1266 | $path = self::getFilePath($file); |
||
| 1267 | |||
| 1268 | if (preg_match('#(^|/|\\\\)\.{1,2}$#', $path)) { |
||
| 1269 | continue; |
||
| 1270 | } |
||
| 1271 | |||
| 1272 | $result[] = self::normalizeFileInfo($file); |
||
| 1273 | } |
||
| 1274 | |||
| 1275 | return array_filter($result); |
||
| 1276 | } |
||
| 1277 | |||
| 1278 | /** |
||
| 1279 | * Get directory timestamp |
||
| 1280 | * |
||
| 1281 | * @param string $directory The directory |
||
| 1282 | * |
||
| 1283 | * @return int directory timestamp |
||
| 1284 | */ |
||
| 1285 | public static function getDirTimestamp(string $directory) : int |
||
| 1286 | { |
||
| 1287 | $_directory = new RecursiveDirectoryIterator( |
||
| 1288 | $directory, |
||
| 1289 | FilesystemIterator::KEY_AS_PATHNAME | |
||
| 1290 | FilesystemIterator::CURRENT_AS_FILEINFO | |
||
| 1291 | FilesystemIterator::SKIP_DOTS |
||
| 1292 | ); |
||
| 1293 | $_iterator = new RecursiveIteratorIterator( |
||
| 1294 | $_directory, |
||
| 1295 | RecursiveIteratorIterator::SELF_FIRST |
||
| 1296 | ); |
||
| 1297 | $_resultFile = $_iterator->current(); |
||
| 1298 | foreach ($_iterator as $file) { |
||
| 1299 | if ($file->getMtime() <= $_resultFile->getMtime()) { |
||
| 1300 | continue; |
||
| 1301 | } |
||
| 1302 | |||
| 1303 | $_resultFile = $file; |
||
| 1304 | } |
||
| 1305 | |||
| 1306 | return $_resultFile->getMtime(); |
||
| 1307 | } |
||
| 1308 | |||
| 1309 | /** |
||
| 1310 | * Returns the mime type of a file. Returns false if the mime type is not found. |
||
| 1311 | * |
||
| 1312 | * @param string $file Full path to the file |
||
| 1313 | * @param bool $guess Set to false to disable mime type guessing |
||
| 1314 | * |
||
| 1315 | * @return mixed |
||
| 1316 | */ |
||
| 1317 | public static function getMimeType(string $file, bool $guess = true) |
||
| 1318 | { |
||
| 1319 | // Get mime using the file information functions |
||
| 1320 | if (function_exists('finfo_open')) { |
||
| 1321 | $info = finfo_open(FILEINFO_MIME_TYPE); |
||
| 1322 | |||
| 1323 | $mime = finfo_file($info, $file); |
||
| 1324 | |||
| 1325 | finfo_close($info); |
||
| 1326 | |||
| 1327 | return $mime; |
||
| 1328 | } |
||
| 1329 | |||
| 1330 | // Just guess mime by using the file extension |
||
| 1331 | if ($guess === true) { |
||
| 1332 | $mime_types = self::$mime_types; |
||
| 1333 | |||
| 1334 | $extension = pathinfo($file, PATHINFO_EXTENSION); |
||
| 1335 | |||
| 1336 | return $mime_types[$extension] ?? false; |
||
| 1337 | } |
||
| 1338 | |||
| 1339 | return false; |
||
| 1340 | } |
||
| 1341 | |||
| 1342 | /** |
||
| 1343 | * Get a file's timestamp. |
||
| 1344 | * |
||
| 1345 | * @param string $path The path to the file. |
||
| 1346 | * |
||
| 1347 | * @return string|false The timestamp or false on failure. |
||
| 1348 | */ |
||
| 1349 | public static function getTimestamp(string $path) |
||
| 1350 | { |
||
| 1351 | return self::getMetadata($path)['timestamp']; |
||
| 1352 | } |
||
| 1353 | |||
| 1354 | /** |
||
| 1355 | * Get a file's size. |
||
| 1356 | * |
||
| 1357 | * @param string $path The path to the file. |
||
| 1358 | * |
||
| 1359 | * @return int|false The file size or false on failure. |
||
| 1360 | */ |
||
| 1361 | public static function getSize(string $path) |
||
| 1362 | { |
||
| 1363 | return self::getMetadata($path)['size']; |
||
| 1364 | } |
||
| 1365 | |||
| 1366 | /** |
||
| 1367 | * Get a file's metadata. |
||
| 1368 | * |
||
| 1369 | * @param string $path The path to the file. |
||
| 1370 | * |
||
| 1371 | * @return array|false The file metadata or false on failure. |
||
| 1372 | */ |
||
| 1373 | public static function getMetadata(string $path) |
||
| 1374 | { |
||
| 1375 | $info = new SplFileInfo($path); |
||
| 1376 | |||
| 1377 | return self::normalizeFileInfo($info); |
||
| 1378 | } |
||
| 1379 | |||
| 1380 | /** |
||
| 1381 | * Get a file's visibility. |
||
| 1382 | * |
||
| 1383 | * @param string $path The path to the file. |
||
| 1384 | * |
||
| 1385 | * @return string|false The visibility (public|private) or false on failure. |
||
| 1386 | */ |
||
| 1387 | public static function getVisibility(string $path) |
||
| 1388 | { |
||
| 1389 | clearstatcache(false, $path); |
||
| 1390 | $permissions = octdec(substr(sprintf('%o', fileperms($path)), -4)); |
||
| 1391 | |||
| 1392 | return $permissions & 0044 ? 'public' : 'private'; |
||
| 1393 | } |
||
| 1394 | |||
| 1395 | /** |
||
| 1396 | * Set the visibility for a file. |
||
| 1397 | * |
||
| 1398 | * @param string $path The path to the file. |
||
| 1399 | * @param string $visibility One of 'public' or 'private'. |
||
| 1400 | * |
||
| 1401 | * @return bool True on success, false on failure. |
||
| 1402 | */ |
||
| 1403 | public static function setVisibility(string $path, string $visibility) : bool |
||
| 1404 | { |
||
| 1405 | $type = is_dir($path) ? 'dir' : 'file'; |
||
| 1406 | $success = chmod($path, self::$permissions[$type][$visibility]); |
||
| 1407 | |||
| 1408 | return $success !== false; |
||
| 1409 | } |
||
| 1410 | |||
| 1411 | /** |
||
| 1412 | * Delete a file. |
||
| 1413 | * |
||
| 1414 | * @return bool True on success, false on failure. |
||
| 1415 | */ |
||
| 1416 | public static function delete(string $path) : bool |
||
| 1417 | { |
||
| 1418 | if (self::has($path)) { |
||
| 1419 | $result = unlink($path); |
||
| 1420 | |||
| 1421 | // Wiping out changes in local file cache |
||
| 1422 | clearstatcache(false, $path); |
||
| 1423 | |||
| 1424 | return $result; |
||
| 1425 | } |
||
| 1426 | |||
| 1427 | return false; |
||
| 1428 | } |
||
| 1429 | |||
| 1430 | /** |
||
| 1431 | * Delete a directory. |
||
| 1432 | * |
||
| 1433 | * @return bool True on success, false on failure. |
||
| 1434 | */ |
||
| 1435 | public static function deleteDir(string $dirname) : bool |
||
| 1436 | { |
||
| 1437 | if (! is_dir($dirname)) { |
||
| 1438 | return false; |
||
| 1439 | } |
||
| 1440 | |||
| 1441 | // Delete dir |
||
| 1442 | if (is_dir($dirname)) { |
||
| 1443 | $ob = scandir($dirname); |
||
| 1444 | foreach ($ob as $o) { |
||
| 1445 | if ($o === '.' || $o === '..') { |
||
| 1446 | continue; |
||
| 1447 | } |
||
| 1448 | |||
| 1449 | if (filetype($dirname . '/' . $o) === 'dir') { |
||
| 1450 | self::deleteDir($dirname . '/' . $o); |
||
| 1451 | } else { |
||
| 1452 | self::delete($dirname . '/' . $o); |
||
| 1453 | } |
||
| 1454 | } |
||
| 1455 | } |
||
| 1456 | |||
| 1457 | reset($ob); |
||
| 1458 | rmdir($dirname); |
||
| 1459 | |||
| 1460 | return true; |
||
| 1461 | } |
||
| 1462 | |||
| 1463 | /** |
||
| 1464 | * Create a directory. |
||
| 1465 | * |
||
| 1466 | * @param string $dirname The name of the new directory. |
||
| 1467 | * @param string $visibility Visibility |
||
| 1468 | * |
||
| 1469 | * @return bool True on success, false on failure. |
||
| 1470 | */ |
||
| 1471 | public static function createDir(string $dirname, string $visibility = 'public') : bool |
||
| 1472 | { |
||
| 1473 | $umask = umask(0); |
||
| 1474 | |||
| 1475 | if (! is_dir($dirname) && ! mkdir($dirname, self::$permissions['dir'][$visibility], true)) { |
||
| 1476 | return false; |
||
| 1477 | } |
||
| 1478 | |||
| 1479 | umask($umask); |
||
| 1480 | |||
| 1481 | return true; |
||
| 1482 | } |
||
| 1483 | |||
| 1484 | /** |
||
| 1485 | * Copy a file(s). |
||
| 1486 | * |
||
| 1487 | * @param string $path Path to the existing file. |
||
| 1488 | * @param string $newpath The new path of the file. |
||
| 1489 | * @param bool $recursive Recursive copy files. |
||
| 1490 | * |
||
| 1491 | * @return bool True on success, false on failure. |
||
| 1492 | */ |
||
| 1493 | public static function copy(string $path, string $newpath, bool $recursive = false) |
||
| 1518 | } |
||
| 1519 | } |
||
| 1520 | } |
||
| 1521 | |||
| 1522 | /** |
||
| 1523 | * Rename a file. |
||
| 1524 | * |
||
| 1525 | * @param string $path Path to the existing file. |
||
| 1526 | * @param string $newpath The new path of the file. |
||
| 1527 | * |
||
| 1528 | * @return bool True on success, false on failure. |
||
| 1529 | */ |
||
| 1530 | public static function rename(string $path, string $newpath) : bool |
||
| 1531 | { |
||
| 1532 | return rename($path, $newpath); |
||
| 1533 | } |
||
| 1534 | |||
| 1535 | /** |
||
| 1536 | * Write a file. |
||
| 1537 | * |
||
| 1538 | * @param string $path The path of the new file. |
||
| 1539 | * @param string $contents The file contents. |
||
| 1540 | * @param string $visibility An optional configuration array. |
||
| 1541 | * @param int $flags Flags |
||
| 1542 | * |
||
| 1543 | * @return bool True on success, false on failure. |
||
| 1544 | */ |
||
| 1545 | public static function write(string $path, string $contents, string $visibility = 'public', int $flags = LOCK_EX) : bool |
||
| 1546 | { |
||
| 1547 | if (file_put_contents($path, $contents, $flags) === false) { |
||
| 1548 | return false; |
||
| 1549 | } |
||
| 1550 | |||
| 1551 | self::setVisibility($path, $visibility); |
||
| 1552 | |||
| 1553 | return true; |
||
| 1554 | } |
||
| 1555 | |||
| 1556 | /** |
||
| 1557 | * Check whether a file exists. |
||
| 1558 | */ |
||
| 1559 | public static function has(string $path) : bool |
||
| 1560 | { |
||
| 1561 | return file_exists($path); |
||
| 1562 | } |
||
| 1563 | |||
| 1564 | /** |
||
| 1565 | * Read a file. |
||
| 1566 | * |
||
| 1567 | * @param string $path The path to the file. |
||
| 1568 | * |
||
| 1569 | * @return string|false The file contents or false on failure. |
||
| 1570 | */ |
||
| 1571 | public static function read(string $path) |
||
| 1572 | { |
||
| 1573 | $contents = file_get_contents($path); |
||
| 1574 | |||
| 1575 | if ($contents === false) { |
||
| 1576 | return false; |
||
| 1577 | } |
||
| 1578 | |||
| 1579 | return $contents; |
||
| 1580 | } |
||
| 1581 | |||
| 1582 | /** |
||
| 1583 | * Normalize the file info. |
||
| 1584 | * |
||
| 1585 | * @return array|void |
||
| 1586 | */ |
||
| 1587 | protected static function normalizeFileInfo(SplFileInfo $file) |
||
| 1588 | { |
||
| 1589 | return self::mapFileInfo($file); |
||
| 1590 | } |
||
| 1591 | |||
| 1592 | /** |
||
| 1593 | * @return array |
||
| 1594 | */ |
||
| 1595 | protected static function mapFileInfo(SplFileInfo $file) : array |
||
| 1596 | { |
||
| 1597 | $normalized = [ |
||
| 1598 | 'type' => $file->getType(), |
||
| 1599 | 'path' => self::getFilePath($file), |
||
| 1600 | ]; |
||
| 1601 | |||
| 1602 | $normalized['timestamp'] = $file->getMTime(); |
||
| 1603 | |||
| 1604 | if ($normalized['type'] === 'file') { |
||
| 1605 | $normalized['size'] = $file->getSize(); |
||
| 1606 | $normalized['filename'] = $file->getFilename(); |
||
| 1607 | $normalized['basename'] = $file->getBasename('.' . $file->getExtension()); |
||
| 1608 | $normalized['extension'] = $file->getExtension(); |
||
| 1609 | } |
||
| 1610 | |||
| 1611 | if ($normalized['type'] === 'dir') { |
||
| 1612 | $normalized['dirname'] = $file->getFilename(); |
||
| 1613 | } |
||
| 1614 | |||
| 1615 | return $normalized; |
||
| 1616 | } |
||
| 1617 | |||
| 1618 | /** |
||
| 1619 | * Get the normalized path from a SplFileInfo object. |
||
| 1620 | */ |
||
| 1621 | protected static function getFilePath(SplFileInfo $file) : string |
||
| 1628 | } |
||
| 1629 | |||
| 1630 | protected static function getRecursiveDirectoryIterator(string $path, int $mode = RecursiveIteratorIterator::SELF_FIRST) : RecursiveIteratorIterator |
||
| 1635 | ); |
||
| 1636 | } |
||
| 1637 | |||
| 1638 | protected static function getDirectoryIterator(string $path) : \DirectoryIterator |
||
| 1641 | } |
||
| 1642 | } |
||
| 1643 |