How can I get the MIME type from a file extension?
问题:
回答1:
UPDATE
For up-to-date mapping with additions from many contributors, see this GitHub repository:
https://github.com/samuelneff/MimeTypeMap
I've found many mime types my application uses are not in the default Windows registry and others are in the registry but not in the list included with IIS. I've compiled a list from these locations and added a few others that we use.
EDIT: See most up-do-date version with contributions here, including an efficient and deterministic two-way mapping.
The NuGet package is also available.
private static IDictionary _mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { #region Big freaking list of mime types // combination of values from Windows 7 Registry and // from C:\Windows\System32\inetsrv\config\applicationHost.config // some added, including .7z and .dat {".323", "text/h323"}, {".3g2", "video/3gpp2"}, {".3gp", "video/3gpp"}, {".3gp2", "video/3gpp2"}, {".3gpp", "video/3gpp"}, {".7z", "application/x-7z-compressed"}, {".aa", "audio/audible"}, {".AAC", "audio/aac"}, {".aaf", "application/octet-stream"}, {".aax", "audio/vnd.audible.aax"}, {".ac3", "audio/ac3"}, {".aca", "application/octet-stream"}, {".accda", "application/msaccess.addin"}, {".accdb", "application/msaccess"}, {".accdc", "application/msaccess.cab"}, {".accde", "application/msaccess"}, {".accdr", "application/msaccess.runtime"}, {".accdt", "application/msaccess"}, {".accdw", "application/msaccess.webapplication"}, {".accft", "application/msaccess.ftemplate"}, {".acx", "application/internet-property-stream"}, {".AddIn", "text/xml"}, {".ade", "application/msaccess"}, {".adobebridge", "application/x-bridge-url"}, {".adp", "application/msaccess"}, {".ADT", "audio/vnd.dlna.adts"}, {".ADTS", "audio/aac"}, {".afm", "application/octet-stream"}, {".ai", "application/postscript"}, {".aif", "audio/x-aiff"}, {".aifc", "audio/aiff"}, {".aiff", "audio/aiff"}, {".air", "application/vnd.adobe.air-application-installer-package+zip"}, {".amc", "application/x-mpeg"}, {".application", "application/x-ms-application"}, {".art", "image/x-jg"}, {".asa", "application/xml"}, {".asax", "application/xml"}, {".ascx", "application/xml"}, {".asd", "application/octet-stream"}, {".asf", "video/x-ms-asf"}, {".ashx", "application/xml"}, {".asi", "application/octet-stream"}, {".asm", "text/plain"}, {".asmx", "application/xml"}, {".aspx", "application/xml"}, {".asr", "video/x-ms-asf"}, {".asx", "video/x-ms-asf"}, {".atom", "application/atom+xml"}, {".au", "audio/basic"}, {".avi", "video/x-msvideo"}, {".axs", "application/olescript"}, {".bas", "text/plain"}, {".bcpio", "application/x-bcpio"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".cab", "application/octet-stream"}, {".caf", "audio/x-caf"}, {".calx", "application/vnd.ms-office.calx"}, {".cat", "application/vnd.ms-pki.seccat"}, {".cc", "text/plain"}, {".cd", "text/plain"}, {".cdda", "audio/aiff"}, {".cdf", "application/x-cdf"}, {".cer", "application/x-x509-ca-cert"}, {".chm", "application/octet-stream"}, {".class", "application/x-java-applet"}, {".clp", "application/x-msclip"}, {".cmx", "image/x-cmx"}, {".cnf", "text/plain"}, {".cod", "image/cis-cod"}, {".config", "application/xml"}, {".contact", "text/x-ms-contact"}, {".coverage", "application/xml"}, {".cpio", "application/x-cpio"}, {".cpp", "text/plain"}, {".crd", "application/x-mscardfile"}, {".crl", "application/pkix-crl"}, {".crt", "application/x-x509-ca-cert"}, {".cs", "text/plain"}, {".csdproj", "text/plain"}, {".csh", "application/x-csh"}, {".csproj", "text/plain"}, {".css", "text/css"}, {".csv", "text/csv"}, {".cur", "application/octet-stream"}, {".cxx", "text/plain"}, {".dat", "application/octet-stream"}, {".datasource", "application/xml"}, {".dbproj", "text/plain"}, {".dcr", "application/x-director"}, {".def", "text/plain"}, {".deploy", "application/octet-stream"}, {".der", "application/x-x509-ca-cert"}, {".dgml", "application/xml"}, {".dib", "image/bmp"}, {".dif", "video/x-dv"}, {".dir", "application/x-director"}, {".disco", "text/xml"}, {".dll", "application/x-msdownload"}, {".dll.config", "text/xml"}, {".dlm", "text/dlm"}, {".doc", "application/msword"}, {".docm", "application/vnd.ms-word.document.macroEnabled.12"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".dot", "application/msword"}, {".dotm", "application/vnd.ms-word.template.macroEnabled.12"}, {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, {".dsp", "application/octet-stream"}, {".dsw", "text/plain"}, {".dtd", "text/xml"}, {".dtsConfig", "text/xml"}, {".dv", "video/x-dv"}, {".dvi", "application/x-dvi"}, {".dwf", "drawing/x-dwf"}, {".dwp", "application/octet-stream"}, {".dxr", "application/x-director"}, {".eml", "message/rfc822"}, {".emz", "application/octet-stream"}, {".eot", "application/octet-stream"}, {".eps", "application/postscript"}, {".etl", "application/etl"}, {".etx", "text/x-setext"}, {".evy", "application/envoy"}, {".exe", "application/octet-stream"}, {".exe.config", "text/xml"}, {".fdf", "application/vnd.fdf"}, {".fif", "application/fractals"}, {".filters", "Application/xml"}, {".fla", "application/octet-stream"}, {".flr", "x-world/x-vrml"}, {".flv", "video/x-flv"}, {".fsscript", "application/fsharp-script"}, {".fsx", "application/fsharp-script"}, {".generictest", "application/xml"}, {".gif", "image/gif"}, {".group", "text/x-ms-group"}, {".gsm", "audio/x-gsm"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".hdf", "application/x-hdf"}, {".hdml", "text/x-hdml"}, {".hhc", "application/x-oleobject"}, {".hhk", "application/octet-stream"}, {".hhp", "application/octet-stream"}, {".hlp", "application/winhlp"}, {".hpp", "text/plain"}, {".hqx", "application/mac-binhex40"}, {".hta", "application/hta"}, {".htc", "text/x-component"}, {".htm", "text/html"}, {".html", "text/html"}, {".htt", "text/webviewhtml"}, {".hxa", "application/xml"}, {".hxc", "application/xml"}, {".hxd", "application/octet-stream"}, {".hxe", "application/xml"}, {".hxf", "application/xml"}, {".hxh", "application/octet-stream"}, {".hxi", "application/octet-stream"}, {".hxk", "application/xml"}, {".hxq", "application/octet-stream"}, {".hxr", "application/octet-stream"}, {".hxs", "application/octet-stream"}, {".hxt", "text/html"}, {".hxv", "application/xml"}, {".hxw", "application/octet-stream"}, {".hxx", "text/plain"}, {".i", "text/plain"}, {".ico", "image/x-icon"}, {".ics", "application/octet-stream"}, {".idl", "text/plain"}, {".ief", "image/ief"}, {".iii", "application/x-iphone"}, {".inc", "text/plain"}, {".inf", "application/octet-stream"}, {".inl", "text/plain"}, {".ins", "application/x-internet-signup"}, {".ipa", "application/x-itunes-ipa"}, {".ipg", "application/x-itunes-ipg"}, {".ipproj", "text/plain"}, {".ipsw", "application/x-itunes-ipsw"}, {".iqy", "text/x-ms-iqy"}, {".isp", "application/x-internet-signup"}, {".ite", "application/x-itunes-ite"}, {".itlp", "application/x-itunes-itlp"}, {".itms", "application/x-itunes-itms"}, {".itpc", "application/x-itunes-itpc"}, {".IVF", "video/x-ivf"}, {".jar", "application/java-archive"}, {".java", "application/octet-stream"}, {".jck", "application/liquidmotion"}, {".jcz", "application/liquidmotion"}, {".jfif", "image/pjpeg"}, {".jnlp", "application/x-java-jnlp-file"}, {".jpb", "application/octet-stream"}, {".jpe", "image/jpeg"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".js", "application/x-javascript"}, {".json", "application/json"}, {".jsx", "text/jscript"}, {".jsxbin", "text/plain"}, {".latex", "application/x-latex"}, {".library-ms", "application/windows-library+xml"}, {".lit", "application/x-ms-reader"}, {".loadtest", "application/xml"}, {".lpk", "application/octet-stream"}, {".lsf", "video/x-la-asf"}, {".lst", "text/plain"}, {".lsx", "video/x-la-asf"}, {".lzh", "application/octet-stream"}, {".m13", "application/x-msmediaview"}, {".m14", "application/x-msmediaview"}, {".m1v", "video/mpeg"}, {".m2t", "video/vnd.dlna.mpeg-tts"}, {".m2ts", "video/vnd.dlna.mpeg-tts"}, {".m2v", "video/mpeg"}, {".m3u", "audio/x-mpegurl"}, {".m3u8", "audio/x-mpegurl"}, {".m4a", "audio/m4a"}, {".m4b", "audio/m4b"}, {".m4p", "audio/m4p"}, {".m4r", "audio/x-m4r"}, {".m4v", "video/x-m4v"}, {".mac", "image/x-macpaint"}, {".mak", "text/plain"}, {".man", "application/x-troff-man"}, {".manifest", "application/x-ms-manifest"}, {".map", "text/plain"}, {".master", "application/xml"}, {".mda", "application/msaccess"}, {".mdb", "application/x-msaccess"}, {".mde", "application/msaccess"}, {".mdp", "application/octet-stream"}, {".me", "application/x-troff-me"}, {".mfp", "application/x-shockwave-flash"}, {".mht", "message/rfc822"}, {".mhtml", "message/rfc822"}, {".mid", "audio/mid"}, {".midi", "audio/mid"}, {".mix", "application/octet-stream"}, {".mk", "text/plain"}, {".mmf", "application/x-smaf"}, {".mno", "text/xml"}, {".mny", "application/x-msmoney"}, {".mod", "video/mpeg"}, {".mov", "video/quicktime"}, {".movie", "video/x-sgi-movie"}, {".mp2", "video/mpeg"}, {".mp2v", "video/mpeg"}, {".mp3", "audio/mpeg"}, {".mp4", "video/mp4"}, {".mp4v", "video/mp4"}, {".mpa", "video/mpeg"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpf", "application/vnd.ms-mediapackage"}, {".mpg", "video/mpeg"}, {".mpp", "application/vnd.ms-project"}, {".mpv2", "video/mpeg"}, {".mqv", "video/quicktime"}, {".ms", "application/x-troff-ms"}, {".msi", "application/octet-stream"}, {".mso", "application/octet-stream"}, {".mts", "video/vnd.dlna.mpeg-tts"}, {".mtx", "application/xml"}, {".mvb", "application/x-msmediaview"}, {".mvc", "application/x-miva-compiled"}, {".mxp", "application/x-mmxp"}, {".nc", "application/x-netcdf"}, {".nsc", "video/x-ms-asf"}, {".nws", "message/rfc822"}, {".ocx", "application/octet-stream"}, {".oda", "application/oda"}, {".odc", "text/x-ms-odc"}, {".odh", "text/plain"}, {".odl", "text/plain"}, {".odp", "application/vnd.oasis.opendocument.presentation"}, {".ods", "application/oleobject"}, {".odt", "application/vnd.oasis.opendocument.text"}, {".one", "application/onenote"}, {".onea", "application/onenote"}, {".onepkg", "application/onenote"}, {".onetmp", "application/onenote"}, {".onetoc", "application/onenote"}, {".onetoc2", "application/onenote"}, {".orderedtest", "application/xml"}, {".osdx", "application/opensearchdescription+xml"}, {".p10", "application/pkcs10"}, {".p12", "application/x-pkcs12"}, {".p7b", "application/x-pkcs7-certificates"}, {".p7c", "application/pkcs7-mime"}, {".p7m", "application/pkcs7-mime"}, {".p7r", "application/x-pkcs7-certreqresp"}, {".p7s", "application/pkcs7-signature"}, {".pbm", "image/x-portable-bitmap"}, {".pcast", "application/x-podcast"}, {".pct", "image/pict"}, {".pcx", "application/octet-stream"}, {".pcz", "application/octet-stream"}, {".pdf", "application/pdf"}, {".pfb", "application/octet-stream"}, {".pfm", "application/octet-stream"}, {".pfx", "application/x-pkcs12"}, {".pgm", "image/x-portable-graymap"}, {".pic", "image/pict"}, {".pict", "image/pict"}, {".pkgdef", "text/plain"}, {".pkgundef", "text/plain"}, {".pko", "application/vnd.ms-pki.pko"}, {".pls", "audio/scpls"}, {".pma", "application/x-perfmon"}, {".pmc", "application/x-perfmon"}, {".pml", "application/x-perfmon"}, {".pmr", "application/x-perfmon"}, {".pmw", "application/x-perfmon"}, {".png", "image/png"}, {".pnm", "image/x-portable-anymap"}, {".pnt", "image/x-macpaint"}, {".pntg", "image/x-macpaint"}, {".pnz", "image/png"}, {".pot", "application/vnd.ms-powerpoint"}, {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, {".ppa", "application/vnd.ms-powerpoint"}, {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, {".ppm", "image/x-portable-pixmap"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prf", "application/pics-rules"}, {".prm", "application/octet-stream"}, {".prx", "application/octet-stream"}, {".ps", "application/postscript"}, {".psc1", "application/PowerShell"}, {".psd", "application/octet-stream"}, {".psess", "application/xml"}, {".psm", "application/octet-stream"}, {".psp", "application/octet-stream"}, {".pub", "application/x-mspublisher"}, {".pwz", "application/vnd.ms-powerpoint"}, {".qht", "text/x-html-insertion"}, {".qhtm", "text/x-html-insertion"}, {".qt", "video/quicktime"}, {".qti", "image/x-quicktime"}, {".qtif", "image/x-quicktime"}, {".qtl", "application/x-quicktimeplayer"}, {".qxd", "application/octet-stream"}, {".ra", "audio/x-pn-realaudio"}, {".ram", "audio/x-pn-realaudio"}, {".rar", "application/octet-stream"}, {".ras", "image/x-cmu-raster"}, {".rat", "application/rat-file"}, {".rc", "text/plain"}, {".rc2", "text/plain"}, {".rct", "text/plain"}, {".rdlc", "application/xml"}, {".resx", "application/xml"}, {".rf", "image/vnd.rn-realflash"}, {".rgb", "image/x-rgb"}, {".rgs", "text/plain"}, {".rm", "application/vnd.rn-realmedia"}, {".rmi", "audio/mid"}, {".rmp", "application/vnd.rn-rn_music_package"}, {".roff", "application/x-troff"}, {".rpm", "audio/x-pn-realaudio-plugin"}, {".rqy", "text/x-ms-rqy"}, {".rtf", "application/rtf"}, {".rtx", "text/richtext"}, {".ruleset", "application/xml"}, {".s", "text/plain"}, {".safariextz", "application/x-safari-safariextz"}, {".scd", "application/x-msschedule"}, {".sct", "text/scriptlet"}, {".sd2", "audio/x-sd2"}, {".sdp", "application/sdp"}, {".sea", "application/octet-stream"}, {".searchConnector-ms", "application/windows-search-connector+xml"}, {".setpay", "application/set-payment-initiation"}, {".setreg", "application/set-registration-initiation"}, {".settings", "application/xml"}, {".sgimb", "application/x-sgimb"}, {".sgml", "text/sgml"}, {".sh", "application/x-sh"}, {".shar", "application/x-shar"}, {".shtml", "text/html"}, {".sit", "application/x-stuffit"}, {".sitemap", "application/xml"}, {".skin", "application/xml"}, {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, {".slk", "application/vnd.ms-excel"}, {".sln", "text/plain"}, {".slupkg-ms", "application/x-ms-license"}, {".smd", "audio/x-smd"}, {".smi", "application/octet-stream"}, {".smx", "audio/x-smd"}, {".smz", "audio/x-smd"}, {".snd", "audio/basic"}, {".snippet", "application/xml"}, {".snp", "application/octet-stream"}, {".sol", "text/plain"}, {".sor", "text/plain"}, {".spc", "application/x-pkcs7-certificates"}, {".spl", "application/futuresplash"}, {".src", "application/x-wais-source"}, {".srf", "text/plain"}, {".SSISDeploymentManifest", "text/xml"}, {".ssm", "application/streamingmedia"}, {".sst", "application/vnd.ms-pki.certstore"}, {".stl", "application/vnd.ms-pki.stl"}, {".sv4cpio", "application/x-sv4cpio"}, {".sv4crc", "application/x-sv4crc"}, {".svc", "application/xml"}, {".swf", "application/x-shockwave-flash"}, {".t", "application/x-troff"}, {".tar", "application/x-tar"}, {".tcl", "application/x-tcl"}, {".testrunconfig", "application/xml"}, {".testsettings", "application/xml"}, {".tex", "application/x-tex"}, {".texi", "application/x-texinfo"}, {".texinfo", "application/x-texinfo"}, {".tgz", "application/x-compressed"}, {".thmx", "application/vnd.ms-officetheme"}, {".thn", "application/octet-stream"}, {".tif", "image/tiff"}, {".tiff", "image/tiff"}, {".tlh", "text/plain"}, {".tli", "text/plain"}, {".toc", "application/octet-stream"}, {".tr", "application/x-troff"}, {".trm", "application/x-msterminal"}, {".trx", "application/xml"}, {".ts", "video/vnd.dlna.mpeg-tts"}, {".tsv", "text/tab-separated-values"}, {".ttf", "application/octet-stream"}, {".tts", "video/vnd.dlna.mpeg-tts"}, {".txt", "text/plain"}, {".u32", "application/octet-stream"}, {".uls", "text/iuls"}, {".user", "text/plain"}, {".ustar", "application/x-ustar"}, {".vb", "text/plain"}, {".vbdproj", "text/plain"}, {".vbk", "video/mpeg"}, {".vbproj", "text/plain"}, {".vbs", "text/vbscript"}, {".vcf", "text/x-vcard"}, {".vcproj", "Application/xml"}, {".vcs", "text/plain"}, {".vcxproj", "Application/xml"}, {".vddproj", "text/plain"}, {".vdp", "text/plain"}, {".vdproj", "text/plain"}, {".vdx", "application/vnd.ms-visio.viewer"}, {".vml", "text/xml"}, {".vscontent", "application/xml"}, {".vsct", "text/xml"}, {".vsd", "application/vnd.visio"}, {".vsi", "application/ms-vsi"}, {".vsix", "application/vsix"}, {".vsixlangpack", "text/xml"}, {".vsixmanifest", "text/xml"}, {".vsmdi", "application/xml"}, {".vspscc", "text/plain"}, {".vss", "application/vnd.visio"}, {".vsscc", "text/plain"}, {".vssettings", "text/xml"}, {".vssscc", "text/plain"}, {".vst", "application/vnd.visio"}, {".vstemplate", "text/xml"}, {".vsto", "application/x-ms-vsto"}, {".vsw", "application/vnd.visio"}, {".vsx", "application/vnd.visio"}, {".vtx", "application/vnd.visio"}, {".wav", "audio/wav"}, {".wave", "audio/wav"}, {".wax", "audio/x-ms-wax"}, {".wbk", "application/msword"}, {".wbmp", "image/vnd.wap.wbmp"}, {".wcm", "application/vnd.ms-works"}, {".wdb", "application/vnd.ms-works"}, {".wdp", "image/vnd.ms-photo"}, {".webarchive", "application/x-safari-webarchive"}, {".webtest", "application/xml"}, {".wiq", "application/xml"}, {".wiz", "application/msword"}, {".wks", "application/vnd.ms-works"}, {".WLMP", "application/wlmoviemaker"}, {".wlpginstall", "application/x-wlpg-detect"}, {".wlpginstall3", "application/x-wlpg3-detect"}, {".wm", "video/x-ms-wm"}, {".wma", "audio/x-ms-wma"}, {".wmd", "application/x-ms-wmd"}, {".wmf", "application/x-msmetafile"}, {".wml", "text/vnd.wap.wml"}, {".wmlc", "application/vnd.wap.wmlc"}, {".wmls", "text/vnd.wap.wmlscript"}, {".wmlsc", "application/vnd.wap.wmlscriptc"}, {".wmp", "video/x-ms-wmp"}, {".wmv", "video/x-ms-wmv"}, {".wmx", "video/x-ms-wmx"}, {".wmz", "application/x-ms-wmz"}, {".wpl", "application/vnd.ms-wpl"}, {".wps", "application/vnd.ms-works"}, {".wri", "application/x-mswrite"}, {".wrl", "x-world/x-vrml"}, {".wrz", "x-world/x-vrml"}, {".wsc", "text/scriptlet"}, {".wsdl", "text/xml"}, {".wvx", "video/x-ms-wvx"}, {".x", "application/directx"}, {".xaf", "x-world/x-vrml"}, {".xaml", "application/xaml+xml"}, {".xap", "application/x-silverlight-app"}, {".xbap", "application/x-ms-xbap"}, {".xbm", "image/x-xbitmap"}, {".xdr", "text/plain"}, {".xht", "application/xhtml+xml"}, {".xhtml", "application/xhtml+xml"}, {".xla", "application/vnd.ms-excel"}, {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, {".xlc", "application/vnd.ms-excel"}, {".xld", "application/vnd.ms-excel"}, {".xlk", "application/vnd.ms-excel"}, {".xll", "application/vnd.ms-excel"}, {".xlm", "application/vnd.ms-excel"}, {".xls", "application/vnd.ms-excel"}, {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".xlt", "application/vnd.ms-excel"}, {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"}, {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, {".xlw", "application/vnd.ms-excel"}, {".xml", "text/xml"}, {".xmta", "application/xml"}, {".xof", "x-world/x-vrml"}, {".XOML", "text/plain"}, {".xpm", "image/x-xpixmap"}, {".xps", "application/vnd.ms-xpsdocument"}, {".xrm-ms", "text/xml"}, {".xsc", "application/xml"}, {".xsd", "text/xml"}, {".xsf", "text/xml"}, {".xsl", "text/xml"}, {".xslt", "text/xml"}, {".xsn", "application/octet-stream"}, {".xss", "application/xml"}, {".xtp", "application/octet-stream"}, {".xwd", "image/x-xwindowdump"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, #endregion }; public static string GetMimeType(string extension) { if (extension == null) { throw new ArgumentNullException("extension"); } if (!extension.StartsWith(".")) { extension = "." + extension; } string mime; return _mappings.TryGetValue(extension, out mime) ? mime : "application/octet-stream"; } 回答2:
For ASP.NET or other
The options were changed a bit in ASP.NET Core, here they are (credits):
new FileExtensionContentTypeProvider().TryGetContentType(fileName, out contentType);(vNext only)- Never tested, but looks like you can officially expand the mime types list via the exposed
Mappingsproperty.
- Never tested, but looks like you can officially expand the mime types list via the exposed
- Use the
MimeTypesNuGet package - Copy the
MimeMappingsfile from the reference source of the .NET Framework
For .NET Framework >= 4.5:
Use the System.Web.MimeMapping.GetMimeMapping method, that is part of the BCL in .NET Framework 4.5:
string mimeType = MimeMapping.GetMimeMapping(fileName); If you need to add custom mappings you probably can use reflection to add mappings to the BCL MimeMapping class, it uses a custom dictionary that exposes this method, so you should invoke the following to add mappings (never tested tho, but should prob. work).
Anyway, when using reflection to add MIME types, be aware that since you're accessing a private field, its name might change or even be totally removed, so you should be extra cautious and add double checks and provide fail safe action for every step.
MimeMapping._mappingDictionary.AddMapping(string fileExtension, string mimeType) 回答3:
You can use this helper function:
private string GetMimeType (string fileName) { string mimeType = "application/unknown"; string ext = System.IO.Path.GetExtension(fileName).ToLower(); Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); if (regKey != null && regKey.GetValue("Content Type") != null) mimeType = regKey.GetValue("Content Type").ToString(); return mimeType; } 回答4:
Just to make Shimmy's answer more clear:
var mimeType = MimeMapping.GetMimeMapping(fileName); System.Web.dll v4.5
// Summary: // Returns the MIME mapping for the specified file name. // // Parameters: // fileName: // The file name that is used to determine the MIME type. public static string GetMimeMapping(string fileName); 回答5:
You can find that information in the registry. For instance, the MIME type for .pdf file can be found in the key HKEY_CLASSES_ROOT\.pdf, in the value "Content Type" :
string mimeType = Registry.GetValue(@"HKEY_CLASSES_ROOT\.pdf", "Content Type", null) as string; 回答6:
I've written a program to fetch and convert the Apache mime.types file to a C# Dictionary keyed by file extension. It's here.
The actual output is this file (but you might want to grab it and run it again in case the Apache file has been updated since I last ran this).
public static Dictionary MimeTypes = new Dictionary { { "123", "application/vnd.lotus-1-2-3" }, { "3dml", "text/vnd.in3d.3dml" }, { "3g2", "video/3gpp2" }, { "3gp", "video/3gpp" }, { "7z", "application/x-7z-compressed" }, { "aab", "application/x-authorware-bin" }, { "aac", "audio/x-aac" }, { "aam", "application/x-authorware-map" }, { "aas", "application/x-authorware-seg" }, { "abw", "application/x-abiword" }, ... 回答7:
I like the work that Samuel Neff did, but not the idea and overhead of creating a dictionary every time.
I restructured things as a switch case. Yes you can't iterate over it but in my case I only ever use it to quickly look up a value. Especially because it is done in a web service, the last thing I want is a bunch of overhead as the application prepares its structures. The compiler will turn this into a hashed lookup and so it will be very fast.
public static string GetMimeType(string extension) { if (extension == null) throw new ArgumentNullException("extension"); if (extension.StartsWith(".")) extension = extension.Substring(1); switch (extension.ToLower()) { #region Big freaking list of mime types case "323": return "text/h323"; case "3g2": return "video/3gpp2"; case "3gp": return "video/3gpp"; case "3gp2": return "video/3gpp2"; case "3gpp": return "video/3gpp"; case "7z": return "application/x-7z-compressed"; case "aa": return "audio/audible"; case "aac": return "audio/aac"; case "aaf": return "application/octet-stream"; case "aax": return "audio/vnd.audible.aax"; case "ac3": return "audio/ac3"; case "aca": return "application/octet-stream"; case "accda": return "application/msaccess.addin"; case "accdb": return "application/msaccess"; case "accdc": return "application/msaccess.cab"; case "accde": return "application/msaccess"; case "accdr": return "application/msaccess.runtime"; case "accdt": return "application/msaccess"; case "accdw": return "application/msaccess.webapplication"; case "accft": return "application/msaccess.ftemplate"; case "acx": return "application/internet-property-stream"; case "addin": return "text/xml"; case "ade": return "application/msaccess"; case "adobebridge": return "application/x-bridge-url"; case "adp": return "application/msaccess"; case "adt": return "audio/vnd.dlna.adts"; case "adts": return "audio/aac"; case "afm": return "application/octet-stream"; case "ai": return "application/postscript"; case "aif": return "audio/x-aiff"; case "aifc": return "audio/aiff"; case "aiff": return "audio/aiff"; case "air": return "application/vnd.adobe.air-application-installer-package+zip"; case "amc": return "application/x-mpeg"; case "application": return "application/x-ms-application"; case "art": return "image/x-jg"; case "asa": return "application/xml"; case "asax": return "application/xml"; case "ascx": return "application/xml"; case "asd": return "application/octet-stream"; case "asf": return "video/x-ms-asf"; case "ashx": return "application/xml"; case "asi": return "application/octet-stream"; case "asm": return "text/plain"; case "asmx": return "application/xml"; case "aspx": return "application/xml"; case "asr": return "video/x-ms-asf"; case "asx": return "video/x-ms-asf"; case "atom": return "application/atom+xml"; case "au": return "audio/basic"; case "avi": return "video/x-msvideo"; case "axs": return "application/olescript"; case "bas": return "text/plain"; case "bcpio": return "application/x-bcpio"; case "bin": return "application/octet-stream"; case "bmp": return "image/bmp"; case "c": return "text/plain"; case "cab": return "application/octet-stream"; case "caf": return "audio/x-caf"; case "calx": return "application/vnd.ms-office.calx"; case "cat": return "application/vnd.ms-pki.seccat"; case "cc": return "text/plain"; case "cd": return "text/plain"; case "cdda": return "audio/aiff"; case "cdf": return "application/x-cdf"; case "cer": return "application/x-x509-ca-cert"; case "chm": return "application/octet-stream"; case "class": return "application/x-java-applet"; case "clp": return "application/x-msclip"; case "cmx": return "image/x-cmx"; case "cnf": return "text/plain"; case "cod": return "image/cis-cod"; case "config": return "application/xml"; case "contact": return "text/x-ms-contact"; case "coverage": return "application/xml"; case "cpio": return "application/x-cpio"; case "cpp": return "text/plain"; case "crd": return "application/x-mscardfile"; case "crl": return "application/pkix-crl"; case "crt": return "application/x-x509-ca-cert"; case "cs": return "text/plain"; case "csdproj": return "text/plain"; case "csh": return "application/x-csh"; case "csproj": return "text/plain"; case "css": return "text/css"; case "csv": return "text/csv"; case "cur": return "application/octet-stream"; case "cxx": return "text/plain"; case "dat": return "application/octet-stream"; case "datasource": return "application/xml"; case "dbproj": return "text/plain"; case "dcr": return "application/x-director"; case "def": return "text/plain"; case "deploy": return "application/octet-stream"; case "der": return "application/x-x509-ca-cert"; case "dgml": return "application/xml"; case "dib": return "image/bmp"; case "dif": return "video/x-dv"; case "dir": return "application/x-director"; case "disco": return "text/xml"; case "dll": return "application/x-msdownload"; case "dll.config": return "text/xml"; case "dlm": return "text/dlm"; case "doc": return "application/msword"; case "docm": return "application/vnd.ms-word.document.macroenabled.12"; case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; case "dot": return "application/msword"; case "dotm": return "application/vnd.ms-word.template.macroenabled.12"; case "dotx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.template"; case "dsp": return "application/octet-stream"; case "dsw": return "text/plain"; case "dtd": return "text/xml"; case "dtsconfig": return "text/xml"; case "dv": return "video/x-dv"; case "dvi": return "application/x-dvi"; case "dwf": return "drawing/x-dwf"; case "dwp": return "application/octet-stream"; case "dxr": return "application/x-director"; case "eml": return "message/rfc822"; case "emz": return "application/octet-stream"; case "eot": return "application/octet-stream"; case "eps": return "application/postscript"; case "etl": return "application/etl"; case "etx": return "text/x-setext"; case "evy": return "application/envoy"; case "exe": return "application/octet-stream"; case "exe.config": return "text/xml"; case "fdf": return "application/vnd.fdf"; case "fif": return "application/fractals"; case "filters": return "application/xml"; case "fla": return "application/octet-stream"; case "flr": return "x-world/x-vrml"; case "flv": return "video/x-flv"; case "fsscript": return "application/fsharp-script"; case "fsx": return "application/fsharp-script"; case "generictest": return "application/xml"; case "gif": return "image/gif"; case "group": return "text/x-ms-group"; case "gsm": return "audio/x-gsm"; case "gtar": return "application/x-gtar"; case "gz": return "application/x-gzip"; case "h": return "text/plain"; case "hdf": return "application/x-hdf"; case "hdml": return "text/x-hdml"; case "hhc": return "application/x-oleobject"; case "hhk": return "application/octet-stream"; case "hhp": return "application/octet-stream"; case "hlp": return "application/winhlp"; case "hpp": return "text/plain"; case "hqx": return "application/mac-binhex40"; case "hta": return "application/hta"; case "htc": return "text/x-component"; case "htm": return "text/html"; case "html": return "text/html"; case "htt": return "text/webviewhtml"; case "hxa": return "application/xml"; case "hxc": return "application/xml"; case "hxd": return "application/octet-stream"; case "hxe": return "application/xml"; case "hxf": return "application/xml"; case "hxh": return "application/octet-stream"; case "hxi": return "application/octet-stream"; case "hxk": return "application/xml"; case "hxq": return "application/octet-stream"; case "hxr": return "application/octet-stream"; case "hxs": return "application/octet-stream"; case "hxt": return "text/html"; case "hxv": return "application/xml"; case "hxw": return "application/octet-stream"; case "hxx": return "text/plain"; case "i": return "text/plain"; case "ico": return "image/x-icon"; case "ics": return "application/octet-stream"; case "idl": return "text/plain"; case "ief": return "image/ief"; case "iii": return "application/x-iphone"; case "inc": return "text/plain"; case "inf": return "application/octet-stream"; case "inl": return "text/plain"; case "ins": return "application/x-internet-signup"; case "ipa": return "application/x-itunes-ipa"; case "ipg": return "application/x-itunes-ipg"; case "ipproj": return "text/plain"; case "ipsw": return "application/x-itunes-ipsw"; case "iqy": return "text/x-ms-iqy"; case "isp": return "application/x-internet-signup"; case "ite": return "application/x-itunes-ite"; case "itlp": return "application/x-itunes-itlp"; case "itms": return "application/x-itunes-itms"; case "itpc": return "application/x-itunes-itpc"; case "ivf": return "video/x-ivf"; case "jar": return "application/java-archive"; case "java": return "application/octet-stream"; case "jck": return "application/liquidmotion"; case "jcz": return "application/liquidmotion"; case "jfif": return "image/pjpeg"; case "jnlp": return "application/x-java-jnlp-file"; case "jpb": return "application/octet-stream"; case "jpe": return "image/jpeg"; case "jpeg": return "image/jpeg"; case "jpg": return "image/jpeg"; case "js": return "application/x-javascript"; case "jsx": return "text/jscript"; case "jsxbin": return "text/plain"; case "latex": return "application/x-latex"; case "library-ms": return "application/windows-library+xml"; case "lit": return "application/x-ms-reader"; case "loadtest": return "application/xml"; case "lpk": return "application/octet-stream"; case "lsf": return "video/x-la-asf"; case "lst": return "text/plain"; case "lsx": return "video/x-la-asf"; case "lzh": return "application/octet-stream"; case "m13": return "application/x-msmediaview"; case "m14": return "application/x-msmediaview"; case "m1v": return "video/mpeg"; case "m2t": return "video/vnd.dlna.mpeg-tts"; case "m2ts": return "video/vnd.dlna.mpeg-tts"; case "m2v": return "video/mpeg"; case "m3u": return "audio/x-mpegurl"; case "m3u8": return "audio/x-mpegurl"; case "m4a": return "audio/m4a"; case "m4b": return "audio/m4b"; case "m4p": return "audio/m4p"; case "m4r": return "audio/x-m4r"; case "m4v": return "video/x-m4v"; case "mac": return "image/x-macpaint"; case "mak": return "text/plain"; case "man": return "application/x-troff-man"; case "manifest": return "application/x-ms-manifest"; case "map": return "text/plain"; case "master": return "application/xml"; case "mda": return "application/msaccess"; case "mdb": return "application/x-msaccess"; case "mde": return "application/msaccess"; case "mdp": return "application/octet-stream"; case "me": return "application/x-troff-me"; case "mfp": return "application/x-shockwave-flash"; case "mht": return "message/rfc822"; case "mhtml": return "message/rfc822"; case "mid": return "audio/mid"; case "midi": return "audio/mid"; case "mix": return "application/octet-stream"; case "mk": return "text/plain"; case "mmf": return "application/x-smaf"; case "mno": return "text/xml"; case "mny": return "application/x-msmoney"; case "mod": return "video/mpeg"; case "mov": return "video/quicktime"; case "movie": return "video/x-sgi-movie"; case "mp2": return "video/mpeg"; case "mp2v": return "video/mpeg"; case "mp3": return "audio/mpeg"; case "mp4": return "video/mp4"; case "mp4v": return "video/mp4"; case "mpa": return "video/mpeg"; case "mpe": return "video/mpeg"; case "mpeg": return "video/mpeg"; case "mpf": return "application/vnd.ms-mediapackage"; case "mpg": return "video/mpeg"; case "mpp": return "application/vnd.ms-project"; case "mpv2": return "video/mpeg"; case "mqv": return "video/quicktime"; case "ms": return "application/x-troff-ms"; case "msi": return "application/octet-stream"; case "mso": return "application/octet-stream"; case "mts": return "video/vnd.dlna.mpeg-tts"; case "mtx": return "application/xml"; case "mvb": return "application/x-msmediaview"; case "mvc": return "application/x-miva-compiled"; case "mxp": return "application/x-mmxp"; case "nc": return "application/x-netcdf"; case "nsc": return "video/x-ms-asf"; case "nws": return "message/rfc822"; case "ocx": return "application/octet-stream"; case "oda": return "application/oda"; case "odc": return "text/x-ms-odc"; case "odh": return "text/plain"; case "odl": return "text/plain"; case "odp": return "application/vnd.oasis.opendocument.presentation"; case "ods": return "application/oleobject"; case "odt": return "application/vnd.oasis.opendocument.text"; case "one": return "application/onenote"; case "onea": return "application/onenote"; case "onepkg": return "application/onenote"; case "onetmp": return "application/onenote"; case "onetoc": return "application/onenote"; case "onetoc2": return "application/onenote"; case "orderedtest": return "application/xml"; case "osdx": return "application/opensearchdescription+xml"; case "p10": return "application/pkcs10"; case "p12": return "application/x-pkcs12"; case "p7b": return "application/x-pkcs7-certificates"; case "p7c": return "application/pkcs7-mime"; case "p7m": return "application/pkcs7-mime"; case "p7r": return "application/x-pkcs7-certreqresp"; case "p7s": return "application/pkcs7-signature"; case "pbm": return "image/x-portable-bitmap"; case "pcast": return "application/x-podcast"; case "pct": return "image/pict"; case "pcx": return "application/octet-stream"; case "pcz": return "application/octet-stream"; case "pdf": return "application/pdf"; case "pfb": return "application/octet-stream"; case "pfm": return "application/octet-stream"; case "pfx": return "application/x-pkcs12"; case "pgm": return "image/x-portable-graymap"; case "pic": return "image/pict"; case "pict": return "image/pict"; case "pkgdef": return "text/plain"; case "pkgundef": return "text/plain"; case "pko": return "application/vnd.ms-pki.pko"; case "pls": return "audio/scpls"; case "pma": return "application/x-perfmon"; case "pmc": return "application/x-perfmon"; case "pml": return "application/x-perfmon"; case "pmr": return "application/x-perfmon"; case "pmw": return "application/x-perfmon"; case "png": return "image/png"; case "pnm": return "image/x-portable-anymap"; case "pnt": return "image/x-macpaint"; case "pntg": return "image/x-macpaint"; case "pnz": return "image/png"; case "pot": return "application/vnd.ms-powerpoint"; case "potm": return "application/vnd.ms-powerpoint.template.macroenabled.12"; case "potx": return "application/vnd.openxmlformats-officedocument.presentationml.template"; case "ppa": return "application/vnd.ms-powerpoint"; case "ppam": return "application/vnd.ms-powerpoint.addin.macroenabled.12"; case "ppm": return "image/x-portable-pixmap"; case "pps": return "application/vnd.ms-powerpoint"; case "ppsm": return "application/vnd.ms-powerpoint.slideshow.macroenabled.12"; case "ppsx": return "application/vnd.openxmlformats-officedocument.presentationml.slideshow"; case "ppt": return "application/vnd.ms-powerpoint"; case "pptm": return "application/vnd.ms-powerpoint.presentation.macroenabled.12"; case "pptx": return "application/vnd.openxmlformats-officedocument.presentationml.presentation"; case "prf": return "application/pics-rules"; case "prm": return "application/octet-stream"; case "prx": return "application/octet-stream"; case "ps": return "application/postscript"; case "psc1": return "application/powershell"; case "psd": return "application/octet-stream"; case "psess": return "application/xml"; case "psm": return "application/octet-stream"; case "psp": return "application/octet-stream"; case "pub": return "application/x-mspublisher"; case "pwz": return "application/vnd.ms-powerpoint"; case "qht": return "text/x-html-insertion"; case "qhtm": return "text/x-html-insertion"; case "qt": return "video/quicktime"; case "qti": return "image/x-quicktime"; case "qtif": return "image/x-quicktime"; case "qtl": return "application/x-quicktimeplayer"; case "qxd": return "application/octet-stream"; case "ra": return "audio/x-pn-realaudio"; case "ram": return "audio/x-pn-realaudio"; case "rar": return "application/octet-stream"; case "ras": return "image/x-cmu-raster"; case "rat": return "application/rat-file"; case "rc": return "text/plain"; case "rc2": return "text/plain"; case "rct": return "text/plain"; case "rdlc": return "application/xml"; case "resx": return "application/xml"; case "rf": return "image/vnd.rn-realflash"; case "rgb": return "image/x-rgb"; case "rgs": return "text/plain"; case "rm": return "application/vnd.rn-realmedia"; case "rmi": return "audio/mid"; case "rmp": return "application/vnd.rn-rn_music_package"; case "roff": return "application/x-troff"; case "rpm": return "audio/x-pn-realaudio-plugin"; case "rqy": return "text/x-ms-rqy"; case "rtf": return "application/rtf"; case "rtx": return "text/richtext"; case "ruleset": return "application/xml"; case "s": return "text/plain"; case "safariextz": return "application/x-safari-safariextz"; case "scd": return "application/x-msschedule"; case "sct": return "text/scriptlet"; case "sd2": return "audio/x-sd2"; case "sdp": return "application/sdp"; case "sea": return "application/octet-stream"; case "searchconnector-ms": return "application/windows-search-connector+xml"; case "setpay": return "application/set-payment-initiation"; case "setreg": return "application/set-registration-initiation"; case "settings": return "application/xml"; case "sgimb": return "application/x-sgimb"; case "sgml": return "text/sgml"; case "sh": return "application/x-sh"; case "shar": return "application/x-shar"; case "shtml": return "text/html"; case "sit": return "application/x-stuffit"; case "sitemap": return "application/xml"; case "skin": return "application/xml"; case "sldm": return "application/vnd.ms-powerpoint.slide.macroenabled.12"; case "sldx": return "application/vnd.openxmlformats-officedocument.presentationml.slide"; case "slk": return "application/vnd.ms-excel"; case "sln": return "text/plain"; case "slupkg-ms": return "application/x-ms-license"; case "smd": return "audio/x-smd"; case "smi": return "application/octet-stream"; case "smx": return "audio/x-smd"; case "smz": return "audio/x-smd"; case "snd": return "audio/basic"; case "snippet": return "application/xml"; case "snp": return "application/octet-stream"; case "sol": return "text/plain"; case "sor": return "text/plain"; case "spc": return "application/x-pkcs7-certificates"; case "spl": return "application/futuresplash"; case "src": return "application/x-wais-source"; case "srf": return "text/plain"; case "ssisdeploymentmanifest": return "text/xml"; case "ssm": return "application/streamingmedia"; case "sst": return "application/vnd.ms-pki.certstore"; case "stl": return "application/vnd.ms-pki.stl"; case "sv4cpio": return "application/x-sv4cpio"; case "sv4crc": return "application/x-sv4crc"; case "svc": return "application/xml"; case "swf": return "application/x-shockwave-flash"; case "t": return "application/x-troff"; case "tar": return "application/x-tar"; case "tcl": return "application/x-tcl"; case "testrunconfig": return "application/xml"; case "testsettings": return "application/xml"; case "tex": return "application/x-tex"; case "texi": return "application/x-texinfo"; case "texinfo": return "application/x-texinfo"; case "tgz": return "application/x-compressed"; case "thmx": return "application/vnd.ms-officetheme"; case "thn": return "application/octet-stream"; case "tif": return "image/tiff"; case "tiff": return "image/tiff"; case "tlh": return "text/plain"; case "tli": return "text/plain"; case "toc": return "application/octet-stream"; case "tr": return "application/x-troff"; case "trm": return "application/x-msterminal"; case "trx": return "application/xml"; case "ts": return "video/vnd.dlna.mpeg-tts"; case "tsv": return "text/tab-separated-values"; case "ttf": return "application/octet-stream"; case "tts": return "video/vnd.dlna.mpeg-tts"; case "txt": return "text/plain"; case "u32": return "application/octet-stream"; case "uls": return "text/iuls"; case "user": return "text/plain"; case "ustar": return "application/x-ustar"; case "vb": return "text/plain"; case "vbdproj": return "text/plain"; case "vbk": return "video/mpeg"; case "vbproj": return "text/plain"; case "vbs": return "text/vbscript"; case "vcf": return "text/x-vcard"; case "vcproj": return "application/xml"; case "vcs": return "text/plain"; case "vcxproj": return "application/xml"; case "vddproj": return "text/plain"; case "vdp": return "text/plain"; case "vdproj": return "text/plain"; case "vdx": return "application/vnd.ms-visio.viewer"; case "vml": return "text/xml"; case "vscontent": return "application/xml"; case "vsct": return "text/xml"; case "vsd": return "application/vnd.visio"; case "vsi": return "application/ms-vsi"; case "vsix": return "application/vsix"; case "vsixlangpack": return "text/xml"; case "vsixmanifest": return "text/xml"; case "vsmdi": return "application/xml"; case "vspscc": return "text/plain"; case "vss": return "application/vnd.visio"; case "vsscc": return "text/plain"; case "vssettings": return "text/xml"; case "vssscc": return "text/plain"; case "vst": return "application/vnd.visio"; case "vstemplate": return "text/xml"; case "vsto": return "application/x-ms-vsto"; case "vsw": return "application/vnd.visio"; case "vsx": return "application/vnd.visio"; case "vtx": return "application/vnd.visio"; case "wav": return "audio/wav"; case "wave": return "audio/wav"; case "wax": return "audio/x-ms-wax"; case "wbk": return "application/msword"; case "wbmp": return "image/vnd.wap.wbmp"; case "wcm": return "application/vnd.ms-works"; case "wdb": return "application/vnd.ms-works"; case "wdp": return "image/vnd.ms-photo"; case "webarchive": return "application/x-safari-webarchive"; case "webtest": return "application/xml"; case "wiq": return "application/xml"; case "wiz": return "application/msword"; case "wks": return "application/vnd.ms-works"; case "wlmp": return "application/wlmoviemaker"; case "wlpginstall": return "application/x-wlpg-detect"; case "wlpginstall3": return "application/x-wlpg3-detect"; case "wm": return "video/x-ms-wm"; case "wma": return "audio/x-ms-wma"; case "wmd": return "application/x-ms-wmd"; case "wmf": return "application/x-msmetafile"; case "wml": return "text/vnd.wap.wml"; case "wmlc": return "application/vnd.wap.wmlc"; case "wmls": return "text/vnd.wap.wmlscript"; case "wmlsc": return "application/vnd.wap.wmlscriptc"; case "wmp": return "video/x-ms-wmp"; case "wmv": return "video/x-ms-wmv"; case "wmx": return "video/x-ms-wmx"; case "wmz": return "application/x-ms-wmz"; case "wpl": return "application/vnd.ms-wpl"; case "wps": return "application/vnd.ms-works"; case "wri": return "application/x-mswrite"; case "wrl": return "x-world/x-vrml"; case "wrz": return "x-world/x-vrml"; case "wsc": return "text/scriptlet"; case "wsdl": return "text/xml"; case "wvx": return "video/x-ms-wvx"; case "x": return "application/directx"; case "xaf": return "x-world/x-vrml"; case "xaml": return "application/xaml+xml"; case "xap": return "application/x-silverlight-app"; case "xbap": return "application/x-ms-xbap"; case "xbm": return "image/x-xbitmap"; case "xdr": return "text/plain"; case "xht": return "application/xhtml+xml"; case "xhtml": return "application/xhtml+xml"; case "xla": return "application/vnd.ms-excel"; case "xlam": return "application/vnd.ms-excel.addin.macroenabled.12"; case "xlc": return "application/vnd.ms-excel"; case "xld": return "application/vnd.ms-excel"; case "xlk": return "application/vnd.ms-excel"; case "xll": return "application/vnd.ms-excel"; case "xlm": return "application/vnd.ms-excel"; case "xls": return "application/vnd.ms-excel"; case "xlsb": return "application/vnd.ms-excel.sheet.binary.macroenabled.12"; case "xlsm": return "application/vnd.ms-excel.sheet.macroenabled.12"; case "xlsx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; case "xlt": return "application/vnd.ms-excel"; case "xltm": return "application/vnd.ms-excel.template.macroenabled.12"; case "xltx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.template"; case "xlw": return "application/vnd.ms-excel"; case "xml": return "text/xml"; case "xmta": return "application/xml"; case "xof": return "x-world/x-vrml"; case "xoml": return "text/plain"; case "xpm": return "image/x-xpixmap"; case "xps": return "application/vnd.ms-xpsdocument"; case "xrm-ms": return "text/xml"; case "xsc": return "application/xml"; case "xsd": return "text/xml"; case "xsf": return "text/xml"; case "xsl": return "text/xml"; case "xslt": return "text/xml"; case "xsn": return "application/octet-stream"; case "xss": return "application/xml"; case "xtp": return "application/octet-stream"; case "xwd": return "image/x-xwindowdump"; case "z": return "application/x-compress"; case "zip": return "application/x-zip-compressed"; #endregion default: return "application/octet-stream"; } } 回答8:
a combination of both solutions presented here:
using System; using System.Collections.Generic; namespace Mime { class Mime { public static string GetMimeType(string fileName) { if (string.IsNullOrEmpty(fileName) || string.IsNullOrWhiteSpace(fileName)) { throw new ArgumentNullException("filename must contain a filename"); } string extension = System.IO.Path.GetExtension(fileName).ToLower(); if (!extension.StartsWith(".")) { extension = "." + extension; } string mime; if (_mappings.TryGetValue(extension, out mime)) return mime; if (GetWindowsMimeType(extension, out mime)) { _mappings.Add(extension, mime); return mime; } return "application/octet-stream"; } public static bool GetWindowsMimeType(string ext, out string mime) { mime="application/octet-stream"; Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); if (regKey != null) { object val=regKey.GetValue("Content Type") ; if (val != null) { string strval = val.ToString(); if(!(string.IsNullOrEmpty(strval)||string.IsNullOrWhiteSpace(strval))) { mime=strval; return true; } } } return false; } static IDictionary _mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { #region Big freaking list of mime types // combination of values from Windows 7 Registry and // from C:\Windows\System32\inetsrv\config\applicationHost.config // some added, including .7z and .dat {".323", "text/h323"}, {".3g2", "video/3gpp2"}, {".3gp", "video/3gpp"}, {".3gp2", "video/3gpp2"}, {".3gpp", "video/3gpp"}, {".7z", "application/x-7z-compressed"}, {".aa", "audio/audible"}, {".AAC", "audio/aac"}, {".aaf", "application/octet-stream"}, {".aax", "audio/vnd.audible.aax"}, {".ac3", "audio/ac3"}, {".aca", "application/octet-stream"}, {".accda", "application/msaccess.addin"}, {".accdb", "application/msaccess"}, {".accdc", "application/msaccess.cab"}, {".accde", "application/msaccess"}, {".accdr", "application/msaccess.runtime"}, {".accdt", "application/msaccess"}, {".accdw", "application/msaccess.webapplication"}, {".accft", "application/msaccess.ftemplate"}, {".acx", "application/internet-property-stream"}, {".AddIn", "text/xml"}, {".ade", "application/msaccess"}, {".adobebridge", "application/x-bridge-url"}, {".adp", "application/msaccess"}, {".ADT", "audio/vnd.dlna.adts"}, {".ADTS", "audio/aac"}, {".afm", "application/octet-stream"}, {".ai", "application/postscript"}, {".aif", "audio/x-aiff"}, {".aifc", "audio/aiff"}, {".aiff", "audio/aiff"}, {".air", "application/vnd.adobe.air-application-installer-package+zip"}, {".amc", "application/x-mpeg"}, {".application", "application/x-ms-application"}, {".art", "image/x-jg"}, {".asa", "application/xml"}, {".asax", "application/xml"}, {".ascx", "application/xml"}, {".asd", "application/octet-stream"}, {".asf", "video/x-ms-asf"}, {".ashx", "application/xml"}, {".asi", "application/octet-stream"}, {".asm", "text/plain"}, {".asmx", "application/xml"}, {".aspx", "application/xml"}, {".asr", "video/x-ms-asf"}, {".asx", "video/x-ms-asf"}, {".atom", "application/atom+xml"}, {".au", "audio/basic"}, {".avi", "video/x-msvideo"}, {".axs", "application/olescript"}, {".bas", "text/plain"}, {".bcpio", "application/x-bcpio"}, {".bin", "application/octet-stream"}, {".bmp", "image/bmp"}, {".c", "text/plain"}, {".cab", "application/octet-stream"}, {".caf", "audio/x-caf"}, {".calx", "application/vnd.ms-office.calx"}, {".cat", "application/vnd.ms-pki.seccat"}, {".cc", "text/plain"}, {".cd", "text/plain"}, {".cdda", "audio/aiff"}, {".cdf", "application/x-cdf"}, {".cer", "application/x-x509-ca-cert"}, {".chm", "application/octet-stream"}, {".class", "application/x-java-applet"}, {".clp", "application/x-msclip"}, {".cmx", "image/x-cmx"}, {".cnf", "text/plain"}, {".cod", "image/cis-cod"}, {".config", "application/xml"}, {".contact", "text/x-ms-contact"}, {".coverage", "application/xml"}, {".cpio", "application/x-cpio"}, {".cpp", "text/plain"}, {".crd", "application/x-mscardfile"}, {".crl", "application/pkix-crl"}, {".crt", "application/x-x509-ca-cert"}, {".cs", "text/plain"}, {".csdproj", "text/plain"}, {".csh", "application/x-csh"}, {".csproj", "text/plain"}, {".css", "text/css"}, {".csv", "text/csv"}, {".cur", "application/octet-stream"}, {".cxx", "text/plain"}, {".dat", "application/octet-stream"}, {".datasource", "application/xml"}, {".dbproj", "text/plain"}, {".dcr", "application/x-director"}, {".def", "text/plain"}, {".deploy", "application/octet-stream"}, {".der", "application/x-x509-ca-cert"}, {".dgml", "application/xml"}, {".dib", "image/bmp"}, {".dif", "video/x-dv"}, {".dir", "application/x-director"}, {".disco", "text/xml"}, {".dll", "application/x-msdownload"}, {".dll.config", "text/xml"}, {".dlm", "text/dlm"}, {".doc", "application/msword"}, {".docm", "application/vnd.ms-word.document.macroEnabled.12"}, {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, {".dot", "application/msword"}, {".dotm", "application/vnd.ms-word.template.macroEnabled.12"}, {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, {".dsp", "application/octet-stream"}, {".dsw", "text/plain"}, {".dtd", "text/xml"}, {".dtsConfig", "text/xml"}, {".dv", "video/x-dv"}, {".dvi", "application/x-dvi"}, {".dwf", "drawing/x-dwf"}, {".dwp", "application/octet-stream"}, {".dxr", "application/x-director"}, {".eml", "message/rfc822"}, {".emz", "application/octet-stream"}, {".eot", "application/octet-stream"}, {".eps", "application/postscript"}, {".etl", "application/etl"}, {".etx", "text/x-setext"}, {".evy", "application/envoy"}, {".exe", "application/octet-stream"}, {".exe.config", "text/xml"}, {".fdf", "application/vnd.fdf"}, {".fif", "application/fractals"}, {".filters", "Application/xml"}, {".fla", "application/octet-stream"}, {".flr", "x-world/x-vrml"}, {".flv", "video/x-flv"}, {".fsscript", "application/fsharp-script"}, {".fsx", "application/fsharp-script"}, {".generictest", "application/xml"}, {".gif", "image/gif"}, {".group", "text/x-ms-group"}, {".gsm", "audio/x-gsm"}, {".gtar", "application/x-gtar"}, {".gz", "application/x-gzip"}, {".h", "text/plain"}, {".hdf", "application/x-hdf"}, {".hdml", "text/x-hdml"}, {".hhc", "application/x-oleobject"}, {".hhk", "application/octet-stream"}, {".hhp", "application/octet-stream"}, {".hlp", "application/winhlp"}, {".hpp", "text/plain"}, {".hqx", "application/mac-binhex40"}, {".hta", "application/hta"}, {".htc", "text/x-component"}, {".htm", "text/html"}, {".html", "text/html"}, {".htt", "text/webviewhtml"}, {".hxa", "application/xml"}, {".hxc", "application/xml"}, {".hxd", "application/octet-stream"}, {".hxe", "application/xml"}, {".hxf", "application/xml"}, {".hxh", "application/octet-stream"}, {".hxi", "application/octet-stream"}, {".hxk", "application/xml"}, {".hxq", "application/octet-stream"}, {".hxr", "application/octet-stream"}, {".hxs", "application/octet-stream"}, {".hxt", "text/html"}, {".hxv", "application/xml"}, {".hxw", "application/octet-stream"}, {".hxx", "text/plain"}, {".i", "text/plain"}, {".ico", "image/x-icon"}, {".ics", "application/octet-stream"}, {".idl", "text/plain"}, {".ief", "image/ief"}, {".iii", "application/x-iphone"}, {".inc", "text/plain"}, {".inf", "application/octet-stream"}, {".inl", "text/plain"}, {".ins", "application/x-internet-signup"}, {".ipa", "application/x-itunes-ipa"}, {".ipg", "application/x-itunes-ipg"}, {".ipproj", "text/plain"}, {".ipsw", "application/x-itunes-ipsw"}, {".iqy", "text/x-ms-iqy"}, {".isp", "application/x-internet-signup"}, {".ite", "application/x-itunes-ite"}, {".itlp", "application/x-itunes-itlp"}, {".itms", "application/x-itunes-itms"}, {".itpc", "application/x-itunes-itpc"}, {".IVF", "video/x-ivf"}, {".jar", "application/java-archive"}, {".java", "application/octet-stream"}, {".jck", "application/liquidmotion"}, {".jcz", "application/liquidmotion"}, {".jfif", "image/pjpeg"}, {".jnlp", "application/x-java-jnlp-file"}, {".jpb", "application/octet-stream"}, {".jpe", "image/jpeg"}, {".jpeg", "image/jpeg"}, {".jpg", "image/jpeg"}, {".js", "application/x-javascript"}, {".jsx", "text/jscript"}, {".jsxbin", "text/plain"}, {".latex", "application/x-latex"}, {".library-ms", "application/windows-library+xml"}, {".lit", "application/x-ms-reader"}, {".loadtest", "application/xml"}, {".lpk", "application/octet-stream"}, {".lsf", "video/x-la-asf"}, {".lst", "text/plain"}, {".lsx", "video/x-la-asf"}, {".lzh", "application/octet-stream"}, {".m13", "application/x-msmediaview"}, {".m14", "application/x-msmediaview"}, {".m1v", "video/mpeg"}, {".m2t", "video/vnd.dlna.mpeg-tts"}, {".m2ts", "video/vnd.dlna.mpeg-tts"}, {".m2v", "video/mpeg"}, {".m3u", "audio/x-mpegurl"}, {".m3u8", "audio/x-mpegurl"}, {".m4a", "audio/m4a"}, {".m4b", "audio/m4b"}, {".m4p", "audio/m4p"}, {".m4r", "audio/x-m4r"}, {".m4v", "video/x-m4v"}, {".mac", "image/x-macpaint"}, {".mak", "text/plain"}, {".man", "application/x-troff-man"}, {".manifest", "application/x-ms-manifest"}, {".map", "text/plain"}, {".master", "application/xml"}, {".mda", "application/msaccess"}, {".mdb", "application/x-msaccess"}, {".mde", "application/msaccess"}, {".mdp", "application/octet-stream"}, {".me", "application/x-troff-me"}, {".mfp", "application/x-shockwave-flash"}, {".mht", "message/rfc822"}, {".mhtml", "message/rfc822"}, {".mid", "audio/mid"}, {".midi", "audio/mid"}, {".mix", "application/octet-stream"}, {".mk", "text/plain"}, {".mmf", "application/x-smaf"}, {".mno", "text/xml"}, {".mny", "application/x-msmoney"}, {".mod", "video/mpeg"}, {".mov", "video/quicktime"}, {".movie", "video/x-sgi-movie"}, {".mp2", "video/mpeg"}, {".mp2v", "video/mpeg"}, {".mp3", "audio/mpeg"}, {".mp4", "video/mp4"}, {".mp4v", "video/mp4"}, {".mpa", "video/mpeg"}, {".mpe", "video/mpeg"}, {".mpeg", "video/mpeg"}, {".mpf", "application/vnd.ms-mediapackage"}, {".mpg", "video/mpeg"}, {".mpp", "application/vnd.ms-project"}, {".mpv2", "video/mpeg"}, {".mqv", "video/quicktime"}, {".ms", "application/x-troff-ms"}, {".msi", "application/octet-stream"}, {".mso", "application/octet-stream"}, {".mts", "video/vnd.dlna.mpeg-tts"}, {".mtx", "application/xml"}, {".mvb", "application/x-msmediaview"}, {".mvc", "application/x-miva-compiled"}, {".mxp", "application/x-mmxp"}, {".nc", "application/x-netcdf"}, {".nsc", "video/x-ms-asf"}, {".nws", "message/rfc822"}, {".ocx", "application/octet-stream"}, {".oda", "application/oda"}, {".odc", "text/x-ms-odc"}, {".odh", "text/plain"}, {".odl", "text/plain"}, {".odp", "application/vnd.oasis.opendocument.presentation"}, {".ods", "application/oleobject"}, {".odt", "application/vnd.oasis.opendocument.text"}, {".one", "application/onenote"}, {".onea", "application/onenote"}, {".onepkg", "application/onenote"}, {".onetmp", "application/onenote"}, {".onetoc", "application/onenote"}, {".onetoc2", "application/onenote"}, {".orderedtest", "application/xml"}, {".osdx", "application/opensearchdescription+xml"}, {".p10", "application/pkcs10"}, {".p12", "application/x-pkcs12"}, {".p7b", "application/x-pkcs7-certificates"}, {".p7c", "application/pkcs7-mime"}, {".p7m", "application/pkcs7-mime"}, {".p7r", "application/x-pkcs7-certreqresp"}, {".p7s", "application/pkcs7-signature"}, {".pbm", "image/x-portable-bitmap"}, {".pcast", "application/x-podcast"}, {".pct", "image/pict"}, {".pcx", "application/octet-stream"}, {".pcz", "application/octet-stream"}, {".pdf", "application/pdf"}, {".pfb", "application/octet-stream"}, {".pfm", "application/octet-stream"}, {".pfx", "application/x-pkcs12"}, {".pgm", "image/x-portable-graymap"}, {".pic", "image/pict"}, {".pict", "image/pict"}, {".pkgdef", "text/plain"}, {".pkgundef", "text/plain"}, {".pko", "application/vnd.ms-pki.pko"}, {".pls", "audio/scpls"}, {".pma", "application/x-perfmon"}, {".pmc", "application/x-perfmon"}, {".pml", "application/x-perfmon"}, {".pmr", "application/x-perfmon"}, {".pmw", "application/x-perfmon"}, {".png", "image/png"}, {".pnm", "image/x-portable-anymap"}, {".pnt", "image/x-macpaint"}, {".pntg", "image/x-macpaint"}, {".pnz", "image/png"}, {".pot", "application/vnd.ms-powerpoint"}, {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, {".ppa", "application/vnd.ms-powerpoint"}, {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, {".ppm", "image/x-portable-pixmap"}, {".pps", "application/vnd.ms-powerpoint"}, {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, {".ppt", "application/vnd.ms-powerpoint"}, {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, {".prf", "application/pics-rules"}, {".prm", "application/octet-stream"}, {".prx", "application/octet-stream"}, {".ps", "application/postscript"}, {".psc1", "application/PowerShell"}, {".psd", "application/octet-stream"}, {".psess", "application/xml"}, {".psm", "application/octet-stream"}, {".psp", "application/octet-stream"}, {".pub", "application/x-mspublisher"}, {".pwz", "application/vnd.ms-powerpoint"}, {".qht", "text/x-html-insertion"}, {".qhtm", "text/x-html-insertion"}, {".qt", "video/quicktime"}, {".qti", "image/x-quicktime"}, {".qtif", "image/x-quicktime"}, {".qtl", "application/x-quicktimeplayer"}, {".qxd", "application/octet-stream"}, {".ra", "audio/x-pn-realaudio"}, {".ram", "audio/x-pn-realaudio"}, {".rar", "application/octet-stream"}, {".ras", "image/x-cmu-raster"}, {".rat", "application/rat-file"}, {".rc", "text/plain"}, {".rc2", "text/plain"}, {".rct", "text/plain"}, {".rdlc", "application/xml"}, {".resx", "application/xml"}, {".rf", "image/vnd.rn-realflash"}, {".rgb", "image/x-rgb"}, {".rgs", "text/plain"}, {".rm", "application/vnd.rn-realmedia"}, {".rmi", "audio/mid"}, {".rmp", "application/vnd.rn-rn_music_package"}, {".roff", "application/x-troff"}, {".rpm", "audio/x-pn-realaudio-plugin"}, {".rqy", "text/x-ms-rqy"}, {".rtf", "application/rtf"}, {".rtx", "text/richtext"}, {".ruleset", "application/xml"}, {".s", "text/plain"}, {".safariextz", "application/x-safari-safariextz"}, {".scd", "application/x-msschedule"}, {".sct", "text/scriptlet"}, {".sd2", "audio/x-sd2"}, {".sdp", "application/sdp"}, {".sea", "application/octet-stream"}, {".searchConnector-ms", "application/windows-search-connector+xml"}, {".setpay", "application/set-payment-initiation"}, {".setreg", "application/set-registration-initiation"}, {".settings", "application/xml"}, {".sgimb", "application/x-sgimb"}, {".sgml", "text/sgml"}, {".sh", "application/x-sh"}, {".shar", "application/x-shar"}, {".shtml", "text/html"}, {".sit", "application/x-stuffit"}, {".sitemap", "application/xml"}, {".skin", "application/xml"}, {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, {".slk", "application/vnd.ms-excel"}, {".sln", "text/plain"}, {".slupkg-ms", "application/x-ms-license"}, {".smd", "audio/x-smd"}, {".smi", "application/octet-stream"}, {".smx", "audio/x-smd"}, {".smz", "audio/x-smd"}, {".snd", "audio/basic"}, {".snippet", "application/xml"}, {".snp", "application/octet-stream"}, {".sol", "text/plain"}, {".sor", "text/plain"}, {".spc", "application/x-pkcs7-certificates"}, {".spl", "application/futuresplash"}, {".src", "application/x-wais-source"}, {".srf", "text/plain"}, {".SSISDeploymentManifest", "text/xml"}, {".ssm", "application/streamingmedia"}, {".sst", "application/vnd.ms-pki.certstore"}, {".stl", "application/vnd.ms-pki.stl"}, {".sv4cpio", "application/x-sv4cpio"}, {".sv4crc", "application/x-sv4crc"}, {".svc", "application/xml"}, {".swf", "application/x-shockwave-flash"}, {".t", "application/x-troff"}, {".tar", "application/x-tar"}, {".tcl", "application/x-tcl"}, {".testrunconfig", "application/xml"}, {".testsettings", "application/xml"}, {".tex", "application/x-tex"}, {".texi", "application/x-texinfo"}, {".texinfo", "application/x-texinfo"}, {".tgz", "application/x-compressed"}, {".thmx", "application/vnd.ms-officetheme"}, {".thn", "application/octet-stream"}, {".tif", "image/tiff"}, {".tiff", "image/tiff"}, {".tlh", "text/plain"}, {".tli", "text/plain"}, {".toc", "application/octet-stream"}, {".tr", "application/x-troff"}, {".trm", "application/x-msterminal"}, {".trx", "application/xml"}, {".ts", "video/vnd.dlna.mpeg-tts"}, {".tsv", "text/tab-separated-values"}, {".ttf", "application/octet-stream"}, {".tts", "video/vnd.dlna.mpeg-tts"}, {".txt", "text/plain"}, {".u32", "application/octet-stream"}, {".uls", "text/iuls"}, {".user", "text/plain"}, {".ustar", "application/x-ustar"}, {".vb", "text/plain"}, {".vbdproj", "text/plain"}, {".vbk", "video/mpeg"}, {".vbproj", "text/plain"}, {".vbs", "text/vbscript"}, {".vcf", "text/x-vcard"}, {".vcproj", "Application/xml"}, {".vcs", "text/plain"}, {".vcxproj", "Application/xml"}, {".vddproj", "text/plain"}, {".vdp", "text/plain"}, {".vdproj", "text/plain"}, {".vdx", "application/vnd.ms-visio.viewer"}, {".vml", "text/xml"}, {".vscontent", "application/xml"}, {".vsct", "text/xml"}, {".vsd", "application/vnd.visio"}, {".vsi", "application/ms-vsi"}, {".vsix", "application/vsix"}, {".vsixlangpack", "text/xml"}, {".vsixmanifest", "text/xml"}, {".vsmdi", "application/xml"}, {".vspscc", "text/plain"}, {".vss", "application/vnd.visio"}, {".vsscc", "text/plain"}, {".vssettings", "text/xml"}, {".vssscc", "text/plain"}, {".vst", "application/vnd.visio"}, {".vstemplate", "text/xml"}, {".vsto", "application/x-ms-vsto"}, {".vsw", "application/vnd.visio"}, {".vsx", "application/vnd.visio"}, {".vtx", "application/vnd.visio"}, {".wav", "audio/wav"}, {".wave", "audio/wav"}, {".wax", "audio/x-ms-wax"}, {".wbk", "application/msword"}, {".wbmp", "image/vnd.wap.wbmp"}, {".wcm", "application/vnd.ms-works"}, {".wdb", "application/vnd.ms-works"}, {".wdp", "image/vnd.ms-photo"}, {".webarchive", "application/x-safari-webarchive"}, {".webtest", "application/xml"}, {".wiq", "application/xml"}, {".wiz", "application/msword"}, {".wks", "application/vnd.ms-works"}, {".WLMP", "application/wlmoviemaker"}, {".wlpginstall", "application/x-wlpg-detect"}, {".wlpginstall3", "application/x-wlpg3-detect"}, {".wm", "video/x-ms-wm"}, {".wma", "audio/x-ms-wma"}, {".wmd", "application/x-ms-wmd"}, {".wmf", "application/x-msmetafile"}, {".wml", "text/vnd.wap.wml"}, {".wmlc", "application/vnd.wap.wmlc"}, {".wmls", "text/vnd.wap.wmlscript"}, {".wmlsc", "application/vnd.wap.wmlscriptc"}, {".wmp", "video/x-ms-wmp"}, {".wmv", "video/x-ms-wmv"}, {".wmx", "video/x-ms-wmx"}, {".wmz", "application/x-ms-wmz"}, {".wpl", "application/vnd.ms-wpl"}, {".wps", "application/vnd.ms-works"}, {".wri", "application/x-mswrite"}, {".wrl", "x-world/x-vrml"}, {".wrz", "x-world/x-vrml"}, {".wsc", "text/scriptlet"}, {".wsdl", "text/xml"}, {".wvx", "video/x-ms-wvx"}, {".x", "application/directx"}, {".xaf", "x-world/x-vrml"}, {".xaml", "application/xaml+xml"}, {".xap", "application/x-silverlight-app"}, {".xbap", "application/x-ms-xbap"}, {".xbm", "image/x-xbitmap"}, {".xdr", "text/plain"}, {".xht", "application/xhtml+xml"}, {".xhtml", "application/xhtml+xml"}, {".xla", "application/vnd.ms-excel"}, {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, {".xlc", "application/vnd.ms-excel"}, {".xld", "application/vnd.ms-excel"}, {".xlk", "application/vnd.ms-excel"}, {".xll", "application/vnd.ms-excel"}, {".xlm", "application/vnd.ms-excel"}, {".xls", "application/vnd.ms-excel"}, {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"}, {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, {".xlt", "application/vnd.ms-excel"}, {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"}, {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, {".xlw", "application/vnd.ms-excel"}, {".xml", "text/xml"}, {".xmta", "application/xml"}, {".xof", "x-world/x-vrml"}, {".XOML", "text/plain"}, {".xpm", "image/x-xpixmap"}, {".xps", "application/vnd.ms-xpsdocument"}, {".xrm-ms", "text/xml"}, {".xsc", "application/xml"}, {".xsd", "text/xml"}, {".xsf", "text/xml"}, {".xsl", "text/xml"}, {".xslt", "text/xml"}, {".xsn", "application/octet-stream"}, {".xss", "application/xml"}, {".xtp", "application/octet-stream"}, {".xwd", "image/x-xwindowdump"}, {".z", "application/x-compress"}, {".zip", "application/x-zip-compressed"}, #endregion }; } } 回答9:
Inspired by Samuel's answer, I wrote an improved version:
- Also works when extension is uppercase.
- Take filename as input, handle files without extensions gracefully.
- Don't include "." in keys.
- List from Apache, for which I wrote a small transformation script.
The resulting source code is over 30K characters so I can't post it here, check it on Github.
回答10:
Most of the solutions are working but why take so efforts while we also can get mime type very easily. In System.Web assembly, there is method for getting the mime type from file name. eg:
string mimeType = MimeMapping.GetMimeMapping(filename); 回答11:
You could use the table provided from Apache's httpd. It should be trivial to map this into a function, dictionary, list, etc.
Also, as seen here, extension->mime type is not necessarily a function. There may be multiple common MIME types per file extension, so you should look at the requirements of your application, and see why you care about MIME types, what you want "to do" with them, etc. Can you use file extensions to key the same behavior? Do you need to read the first few bytes of a file to determine its MIME type as well?
回答12:
To make the post more comprehensive, for .NET Core devs there is FileExtensionContentTypeProvider class, which covers the official MIME content types.
It works behind the scene - sets ContentType in the Http Response headers based on the filename extension.
In case you need special MIME types, see example on customising the MIME types:
public void Configure(IApplicationBuilder app) { // Set up custom content types -associating file extension to MIME type var provider = new FileExtensionContentTypeProvider(); // Add new mappings provider.Mappings[".myapp"] = "application/x-msdownload"; provider.Mappings[".htm3"] = "text/html"; provider.Mappings[".image"] = "image/png"; // Replace an existing mapping provider.Mappings[".rtf"] = "application/x-msdownload"; // Remove MP4 videos. provider.Mappings.Remove(".mp4"); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")), RequestPath = new PathString("/MyImages"), ContentTypeProvider = provider }); app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")), RequestPath = new PathString("/MyImages") }); } 回答13:
If you do not want to add additional dependencies and still want version-independent requests, you can mix this answer on how to get the MIME-Type in different .NET versions with this answer on conditional builds for multiple .NET Framework versions.
First thing I did was editing my project file. After the last build definition, I added the property group as stated in the second answer:
$(DefineConstants);$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", "")) $(DefineConstants.Remove($(DefineConstants.LastIndexOf(";NET"))));$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", "")) Now I provided a different implementations for the MimeExtensionHelper from the first answer, with an additional one for all clients from .NET 4.5 or later simply calling System.Web.MimeMapping.GetMimeMapping:
#if (NET10 || NET11 || NET20 || NET30 || NET35) public static class MimeExtensionHelper { static object locker = new object(); static MethodInfo getMimeMappingMethodInfo; static MimeExtensionHelper() { Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping"); if (mimeMappingType == null) throw new SystemException("Couldnt find MimeMapping type"); ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); if (constructorInfo == null) throw new SystemException("Couldnt find default constructor for MimeMapping"); mimeMapping = constructorInfo.Invoke(null); if (mimeMapping == null) throw new SystemException("Couldnt find MimeMapping"); getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic); if (getMimeMappingMethodInfo == null) throw new SystemException("Couldnt find GetMimeMapping method"); if (getMimeMappingMethodInfo.ReturnType != typeof(string)) throw new SystemException("GetMimeMapping method has invalid return type"); if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string)) throw new SystemException("GetMimeMapping method has invalid parameters"); } public static string GetMimeType(string fileName) { lock (locker) { return (string)getMimeMappingMethodInfo.Invoke(null, new object[] { fileName }); } } } #elif NET40 public static class MimeExtensionHelper { static object locker = new object(); static MethodInfo getMimeMappingMethodInfo; static MimeExtensionHelper() { Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping"); if (mimeMappingType == null) throw new SystemException("Couldnt find MimeMapping type"); getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); if (getMimeMappingMethodInfo == null) throw new SystemException("Couldnt find GetMimeMapping method"); if (getMimeMappingMethodInfo.ReturnType != typeof(string)) throw new SystemException("GetMimeMapping method has invalid return type"); if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string)) throw new SystemException("GetMimeMapping method has invalid parameters"); } public static string GetMimeType(string fileName) { lock (locker) { return (string)getMimeMappingMethodInfo.Invoke(null, new object[] { fileName }); } } } #else // .NET 4.5 or later public static class MimeExtensionHelper { public static string GetMimeType(string fileName) { return MimeMapping.GetMimeMapping(fileName); } } #endif Also in the versions prior to .NET 4.5, the static MimeMapping class hosts an static instance called _mappingDictionary (of type MimeMapping.MimeMappingDictionaryBase) which you can request from Reflection in order to add new MIME-Types that may not yet be supported.
回答14:
It is always not necessary that the mime type calculated by the extention of the file will be always right.
lets say i can save a file with .png extention but the fileformat i can set as "ImageFormat.jpeg".
So in this case the file which you will be calculating, will give a different result... it may result in big size file than the original.
If you are working with images then you can use the imagecodecInfo and ImageFormat.
回答15:
Bryan Denny's post above is not working for me since not all extensions have a "Content Type" sub-key in the registry. I had to tweak the code as follows:
private string GetMimeType(string sFileName) { // Get file extension and if it is empty, return unknown string sExt = Path.GetExtension(sFileName); if (string.IsNullOrEmpty(sExt)) return "Unknown file type"; // Default type is "EXT File" string mimeType = string.Format("{0} File", sExt.ToUpper().Replace(".", "")); // Open the registry key for the extension under HKEY_CLASSES_ROOT and return default if it doesn't exist Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(sExt); if (regKey == null) return mimeType; // Get the "(Default)" value and re-open the key for that value string sSubType = regKey.GetValue("").ToString(); regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(sSubType); // If it exists, get the "(Default)" value of the new key if (regKey?.GetValue("") != null) mimeType = regKey.GetValue("").ToString(); // Return the value return mimeType; } Now it works fine for me for all registered file types and un-registered or generic file types (like JPG, etc).
回答16:
I have compiled a list of reputable sources for mime type and content type values that are keyed solely on file extension (currently).
The nuget package is here https://www.nuget.org/packages/FTTLib.dll/
and source is here https://github.com/brondavies/filetypetranslator/
This library is designed to have:
- No external dependencies
- No file system access
- Small memory footprint
- Simple static methods (no extension methods and no instantiatable classes)
- Case-insensitive
- Portable - works in applications targeting any CLR (.NET 2.0+)
回答17:
This helper class returns mime type (content type), description and icons for any file name:
using Microsoft.Win32; using System; using System.Drawing; using System.IO; using System.Runtime.InteropServices; public static class Helper { [DllImport("shell32.dll", CharSet = CharSet.Auto)] private static extern int ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phIconLarge, IntPtr[] phIconSmall, int nIcons); [DllImport("user32.dll", SetLastError = true)] private static extern int DestroyIcon(IntPtr hIcon); public static string GetFileContentType(string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } RegistryKey registryKey = null; try { FileInfo fileInfo = new FileInfo(fileName); if (string.IsNullOrEmpty(fileInfo.Extension)) { return string.Empty; } string extension = fileInfo.Extension.ToLowerInvariant(); registryKey = Registry.ClassesRoot.OpenSubKey(extension); if (registryKey == null) { return string.Empty; } object contentTypeObject = registryKey.GetValue("Content Type"); if (!(contentTypeObject is string)) { return string.Empty; } string contentType = (string)contentTypeObject; return contentType; } catch (Exception) { return null; } finally { if (registryKey != null) { registryKey.Close(); } } } public static string GetFileDescription(string fileName) { if (fileName == null) { throw new ArgumentNullException("fileName"); } RegistryKey registryKey1 = null; RegistryKey registryKey2 = null; try { FileInfo fileInfo = new FileInfo(fileName); if (string.IsNullOrEmpty(fileInfo.Extension)) { return string.Empty; } string extension = fileInfo.Extension.ToLowerInvariant(); registryKey1 = Registry.ClassesRoot.OpenSubKey(extension); if (registryKey1 == null) { return string.Empty; } object extensionDefaultObject = registryKey1.GetValue(null); if (!(extensionDefaultObject is string)) { return string.Empty; } string extensionDefaultValue = (string)extensionDefaultObject; registryKey2 = Registry.ClassesRoot.OpenSubKey(extensionDefaultValue); if (registryKey2 == null) { return string.Empty; } object fileDescriptionObject = registryKey2.GetValue(null); if (!(fileDescriptionObject is string)) { return string.Empty; } string fileDescription = (string)fileDescriptionObject; return fileDescription; } catch (Exception) { return null; } finally { if (registryKey2 != null) { registryKey2.Close(); } if (registryKey1 != null) { registryKey1.Close(); } } } public static void GetFileIcons(string fileName, out Icon smallIcon, out Icon largeIcon) { if (fileName == null) { throw new ArgumentNullException("fileName"); } smallIcon = null; largeIcon = null; RegistryKey registryKey1 = null; RegistryKey registryKey2 = null; try { FileInfo fileInfo = new FileInfo(fileName); if (string.IsNullOrEmpty(fileInfo.Extension)) { return; } string extension = fileInfo.Extension.ToLowerInvariant(); registryKey1 = Registry.ClassesRoot.OpenSubKey(extension); if (registryKey1 == null) { return; } object extensionDefaultObject = registryKey1.GetValue(null); if (!(extensionDefaultObject is string)) { return; } string defaultIconKeyName = string.Format("{0}\\DefaultIcon", extensionDefaultObject); registryKey2 = Registry.ClassesRoot.OpenSubKey(defaultIconKeyName); if (registryKey2 == null) { return; } object defaultIconPathObject = registryKey2.GetValue(null); if (!(defaultIconPathObject is string)) { return; } string defaultIconPath = (string)defaultIconPathObject; if (string.IsNullOrWhiteSpace(defaultIconPath)) { return; } string iconfileName = null; int iconIndex = 0; int commaIndex = defaultIconPath.IndexOf(","); if (commaIndex > 0) { iconfileName = defaultIconPath.Substring(0, commaIndex); string iconIndexString = defaultIconPath.Substring(commaIndex + 1); if (!int.TryParse(iconIndexString, out iconIndex)) { iconIndex = 0; } } else { iconfileName = defaultIconPath; iconIndex = 0; } IntPtr[] phiconSmall = new IntPtr[1] { IntPtr.Zero }; IntPtr[] phiconLarge = new IntPtr[1] { IntPtr.Zero }; int readIconCount = ExtractIconEx(iconfileName, iconIndex, phiconLarge, phiconSmall, 1); if (readIconCount Usage:
string fileName = "NotExists.txt"; string contentType = Helper.GetFileContentType(fileName); // "text/plain" string description = Helper.GetFileDescription(fileName); // "Text Document" Icon smallIcon, largeIcon; Helper.GetFileIcons(fileName, out smallIcon, out largeIcon); // 16x16, 32x32 icons 回答18:
FileExtension handle the file extension and not the Mime. The user can change the file extension, so check the Mime. The codes examples associate Mime by file extension, this is wrong and does not work.
Need to get the contenttype file and check if the table Mime contetType this file according to the file extension. Now, how to get the ContentType of the file?
Using FileUpload is thus: FileUpload.PostedFile.ContentType; Now if I already have the file, as caught your ContentType?