从文件扩展名中获取 MIME 类型
Posted
技术标签:
【中文标题】从文件扩展名中获取 MIME 类型【英文标题】:Get MIME type from filename extension 【发布时间】:2010-11-05 00:14:42 【问题描述】:如何?
【问题讨论】:
我认为最好的是http://msdn.microsoft.com/en-us/library/system.web.mimemapping.aspx @Yuki,感谢您添加新的相关信息。不幸的是,在 .NET 4.5 中可用的 MS 实现只有 195 个映射,无法添加更多,并且不可配置。我下面的列表有 560 多个映射。奇怪的是,MS 列表甚至缺少非常常见的 MS 扩展名,例如 .docx 和 .xlsx 以及其他重要的 Web 扩展名,例如 .csv、.swf 和 .air。 【参考方案1】:对于 ASP.NET 或其他
这些选项在 ASP.NET Core 中有所更改,这里是 (credits):
new FileExtensionContentTypeProvider().TryGetContentType(fileName, out contentType);
(仅限 vNext)
从未测试过,但看起来您可以通过公开的 Mappings
属性正式扩展 mime 类型列表。
使用MimeTypes
NuGet 包
从 .NET Framework 的 reference source 复制 MimeMappings
文件
对于 .NET Framework >= 4.5:
使用 System.Web.MimeMapping.GetMimeMapping
方法,它是 .NET Framework 4.5 中 BCL 的一部分:
string mimeType = MimeMapping.GetMimeMapping(fileName);
如果您需要添加自定义映射,您可能可以使用反射将映射添加到 BCL MimeMapping
类,它使用公开此方法的自定义字典,因此您应该调用以下命令来添加映射(从未测试过,但应该可以工作)。
无论如何,当使用反射添加 MIME 类型时,请注意,由于您访问的是私有字段,其名称可能会更改甚至完全删除,因此您应该格外小心并添加双重检查并提供故障安全操作每一步。
MimeMapping._mappingDictionary.AddMapping(string fileExtension, string mimeType)
【讨论】:
+1 用于添加新的相关信息。不幸的是,在 .NET 4.5 中可用的 MS 实现只有 195 个映射,无法添加更多,并且不可配置。我上面的清单有 560 个映射。奇怪的是,MS 列表甚至缺少非常常见的 MS 扩展,例如.docx
和 .xlsx
以及其他重要的 Web 扩展,例如 .csv
、.swf
和 .air
。
@SamuelNeff 您当然可以使用反射添加映射 (MimeMapping._mappingDictionary.AddMapping(string fileExtension, string mimeType)
)。
在私有字段上使用反射不是一个好主意。它们将来更有可能发生变化,因为它不是商定的合同,如果发生这种情况,您将收到运行时错误而不是编译时错误。如果您打算这样做,您至少应该为其添加单元测试,以确保在升级 .NET 版本时尽早捕获它。除此之外,如果您要手动添加映射,您不妨维护自己的集合。该类只不过是字典的包装器。
当然,这将防止错误,但如果变量和方法不存在,您添加自定义映射的代码将不起作用。你不会再犯错误了。我们可以不同意和争论,最重要的是你是对的,你可以通过反射在技术上调用它,但我个人绝不建议在生产应用程序中对私有属性使用反射,除非它是绝对必要的并且如果没有适当的保护措施来及早发现它它失败了。
FWIW,System.Web 已从 ASP.NET CORE (asp.net 5) 中删除,这意味着不再有 MimeMapping。【参考方案2】:
更新
有关许多贡献者添加的最新映射,请参阅此 GitHub 存储库:
https://github.com/samuelneff/MimeTypeMap
和 NuGet 包
https://www.nuget.org/packages/MimeTypeMapOfficial/
我发现我的应用程序使用的许多 mime 类型不在默认的 Windows 注册表中,而其他类型在注册表中但不在 IIS 包含的列表中。我已经从这些位置编译了一个列表,并添加了一些我们使用的其他位置。
编辑:查看带有 here 贡献的最新版本,包括高效且确定性的双向映射。
private static IDictionary<string, string> _mappings = new Dictionary<string, string>(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";
【讨论】:
不知何故,我觉得在启动时从数据文件构建关联数据结构会更明智。 嘿 pplz MSFT 现在已经实现了! Check this @Shimmy,很有趣。不幸的是,在 .NET 4.5 中可用的 MS 实现只有 195 个映射,无法添加更多,并且不可配置。我上面的清单有 560 个映射。奇怪的是,MS 列表甚至缺少非常常见的 MS 扩展,例如.docx
和 .xlsx
以及其他重要的 Web 扩展,例如 .csv
、.swf
和 .air
。
@JonPurdy,我终于开始重构它以使用字典。
@AnthonyVO,有趣的是,我最初将它作为一个开关。实际上,当您在字符串上创建开关时,它的开销比字典要多。反编译代码。它实际上做的是创建一个指针字典,然后在字典中查找指针以跳转到该位置。因此,字典的开销实际上更少。【参考方案3】:
你可以使用这个辅助函数:
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;
【讨论】:
请记住,您正在运行此代码的机器只会“知道”某些类型 - 例如如果机器从未安装过 PDF 阅读器,则不会列出 PDF。 是的,这有点危险,因为它来自注册表,并且可能会错过未安装软件的扩展名,例如 .xlsx 如果只有旧版本的 Office,则只有 .xls 此外,每次您需要 MIME 类型时,执行注册表查找的调用都会非常昂贵。也许如果它被缓存了,但我还是更喜欢 Samuel 写的静态字典方法。 ...或者,如果您使用的是 Mono,您实际上并没有 Windows 注册表可供您使用... :) @dadwithkids 我不确定为什么注册表查找会“慢”.. 注册表访问已经非常优化(并且必须比 HTTP 上下文本身更快)。只需在某个时候监视注册表访问,以查看每秒要求处理多少次操作。【参考方案4】:只是为了让Shimmy 的answer 更清楚:
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);
【讨论】:
var mimetype = System.Web.MimeMapping.GetMimeMapping(filenamewithext);【参考方案5】:我喜欢 Samuel Neff 所做的工作,但不喜欢每次都创建字典的想法和开销。
我将事物重组为开关盒。是的,你不能迭代它,但在我的例子中,我只用它来快速查找一个值。特别是因为它是在 Web 服务中完成的,所以我最不想要的就是应用程序准备其结构时的大量开销。编译器会将其转换为散列查找,因此速度会非常快。
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";
【讨论】:
有人有这个函数的逆吗?按 mime 类型设置扩展名?只是懒惰:P @FabioG 我不确定这对你是否有用。例如,MIME 类型“application/xml”将有来自该列表的 43 个匹配的扩展名。 @Barrie 你能做类似的事情吗:简单地使用列表中的第一个,以获得标准扩展名(最小公分母的刺),例如"application/xml" => .xml 和 "image/jpeg" =>.jpg 可以在大多数操作系统上运行,不是吗?我错过了什么?猜测这对于某些标准类型会很好,但在这个长长的列表中却失败了很多。想法? 只需将其设为静态即可避免开销。然而,当涉及到“开销”时,带有字符串的开关盒是一件可怕的事情。简单来说......在处理器层面,一切都只是检查和跳转;if
/else
, while
, for
... 这些都不存在。 switch
/case
,然而,应用于通常在枚举中找到的小整数值,确实存在。这是一个非常优雅的小手术。它也根本不适用于字符串,这意味着你写的实际上只是一堆字符串比较。任何一天,一个 Dictionary 对象都能胜过。
@Nyerguds,我不相信你的断言是正确的。请参阅:***.com/a/395965/438458,另请参阅 Jon Skeet 对答案的评论。基本上,编译器比你想象的要聪明。【参考方案6】:
您可以在注册表中找到该信息。例如,.pdf 文件的 MIME 类型可以在键 HKEY_CLASSES_ROOT\.pdf
的值“Content Type”中找到:
string mimeType = Registry.GetValue(@"HKEY_CLASSES_ROOT\.pdf", "Content Type", null) as string;
【讨论】:
如果您使用的是 Windows,可以。基本思想是“找到提供此信息的位置”,并将其导入某种数据结构中。 OP 与 ASP.NET 相关...好的,由于 Mono,ASP.NET 可以在 Linux 上运行,但这不是一个很常见的场景,所以我认为假设是相当安全的acidzombie24 正在使用 Windows... 在谈论 ASP.NET 时我会假设 Windows 是给定的,而不是指定使用 Linux。 谨慎使用此解决方案,因为结果取决于客户端安装的软件。即没有 Office,.doc 没有任何内容类型。 是的,马克说得对。似乎我需要为 .PDF 安装 Adobe Acrobat 来查找 mimetype(在 Windows Server 2008 R2 上尝试过)。因此,与扩展关联的程序似乎维护了这种 mimetype(不是 windows)。【参考方案7】:我编写了一个程序来获取 Apache mime.types file 并将其转换为由文件扩展名键入的 C# Dictionary<string, string>
。我是here。
实际输出为this file(但您可能需要获取它并再次运行它,以防我上次运行后Apache 文件已更新)。
public static Dictionary<string, string> MimeTypes = new Dictionary<string, string>
"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" ,
...
【讨论】:
哦,真漂亮!我可能会反过来做类似的事情;生成一个类,其中每个 mime 类型的Dictionary<String,String[]>
及其所有扩展名。它对于根据提交的内容类型检查下载并在需要时添加默认扩展很有用。
@Nyerguds 这听起来很有用。如果您想做 PR 以将其添加到上述内容中,我很乐意将其合并。或者你当然可以做你自己的事!但是这两个方向听起来确实很有用。
主要问题似乎是“默认”部分……在这些 mime 类型的众多扩展中,哪一个是理想的默认值。无论如何,我可能不得不硬编码这些列表【参考方案8】:
我知道问题是针对 C# 我只想保留 Javascript 格式,因为我刚刚转换了 Samuel 的答案:
export const contentTypes =
".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"
【讨论】:
【参考方案9】:此处介绍的两种解决方案的组合:
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<string, string> _mappings = new Dictionary<string, string>(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
;
【讨论】:
注册成功后,缓存到字典中【参考方案10】:为了使帖子更全面,对于 .NET Core 开发人员,有一个 FileExtensionContentTypeProvider 类,它涵盖了官方的 MIME content types。
它在幕后工作 - 根据文件扩展名在 Http 响应标头中设置 ContentType。
如果您需要特殊的 MIME 类型,请参阅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")
);
【讨论】:
感谢您让我们知道这一点。给您一个提示:要获取 Web 应用程序的根文件夹,您应该使用 _hostingEnvironment.WebRootPath - 请参阅 here【参考方案11】:大多数解决方案都有效,但为什么要如此努力,而我们也可以很容易地获得 mime 类型。 在 System.Web 程序集中,有一种方法可以从文件名中获取 mime 类型。 例如:
string mimeType = MimeMapping.GetMimeMapping(filename);
【讨论】:
3 年前在这一页上给出了相同的答案。 ***.com/a/14108040/315445【参考方案12】:使用 MimeTypeMap 包,它提供文件扩展名到 mime 类型和 mime 类型到文件扩展名的巨大双向映射
使用 MimeType;
将 mime 类型添加到扩展程序
Console.WriteLine("txt -> " + MimeTypeMap.GetMimeType("txt")); // "text/plain"
获取 MIME 类型的扩展
Console.WriteLine("audio/wav -> " + MimeTypeMap.GetExtension("audio/wav")); // ".wav"
GitHub 网址:https://github.com/samuelneff/MimeTypeMap
【讨论】:
【参考方案13】:受 Samuel 回答的启发,我写了一个改进版:
当扩展名是大写时也可以使用。 以文件名作为输入,优雅地处理无扩展名的文件。 不要包含“.”键。 来自Apache 的列表,我为此写了small transformation script。生成的源代码超过 30K 个字符,因此我无法在此处发布,请查看on Github。
【讨论】:
【参考方案14】:** 使用 MediaTypeNames 类-->示例:MediaTypeNames.Application.Pdf **
【讨论】:
虽然MediaTypeNames
在使用 HttpResponseMessage
从 Web API 返回某些内容时会很方便,但它实际上与 OP 的要求相反。【参考方案15】:
我对这些 mimetypes 的看法,使用 apache 列表,下面的脚本将为您提供一个包含所有 mimetypes 的字典。
var mimeTypeListUrl = "http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types";
var webClient = new WebClient();
var rawData = webClient.DownloadString(mimeTypeListUrl).Split(new[] Environment.NewLine, "\n" , StringSplitOptions.RemoveEmptyEntries);
var extensionToMimeType = new Dictionary<string, string>();
var mimeTypeToExtension = new Dictionary<string, string[]>();
foreach (var row in rawData)
if (row.StartsWith("#")) continue;
var rowData = row.Split(new[] "\t" , StringSplitOptions.RemoveEmptyEntries);
if (rowData.Length != 2) continue;
var extensions = rowData[1].Split(new[] " " , StringSplitOptions.RemoveEmptyEntries);
if (!mimeTypeToExtension.ContainsKey(rowData[0]))
mimeTypeToExtension.Add(rowData[0], extensions);
foreach (var extension in extensions)
if (!extensionToMimeType.ContainsKey(extension))
extensionToMimeType.Add(extension, rowData[0]);
【讨论】:
【参考方案16】:您不应该相信来自客户端的文件扩展名。始终检查文件的幻数。
在 ASP.NET Core 中使用 FileTpeInterrogator:
public static class FileTypeChecker
private static List<string> validVideoMimeTypes = new List<string> "video/mp4", "video/quicktime" ;
private static List<string> validImageMimeTypes = new List<string> "image/png", "image/jpeg" ;
public static bool IsValidVideo(IFormFile file)
return validVideoMimeTypes.Contains(GetFileMimeType(file));
public static bool IsValidImage(IFormFile file)
return validImageMimeTypes.Contains(GetFileMimeType(file));
private static string GetFileMimeType(IFormFile file)
// You should have checked for null and file length before reaching here
IFileTypeInterrogator interrogator = new FileTypeInterrogator.FileTypeInterrogator();
byte[] fileBytes;
using (var stream = new MemoryStream())
file.CopyTo(stream);
fileBytes = stream.ToArray();
FileTypeInfo fileTypeInfo = interrogator.DetectType(fileBytes);
return fileTypeInfo.MimeType.ToLower();
在您的控制器或服务内部:
public IActionResult UploadVideo([FromForm] UploadVideoVM model)
if (model.File.Length < minimumLength || model.File.Length > maximumLength)
// BadRequest => Size
else if (!FileTypeChecker.IsValidVideo(model.File))
// BadRequest => Type
else
// All good
return Ok();
要获取文件扩展名的 MIME 类型,请参阅this file。
【讨论】:
存在与此 nuget 相关的漏洞问题:nvd.nist.gov/vuln/detail/CVE-2014-8117,还有其他选择吗?【参考方案17】:您可以使用Apache 的httpd 提供的表格。将其映射到函数、字典、列表等应该很简单。
另外,正如here 所见,extension->mime 类型不一定是函数。每个文件扩展名可能有多种常见的 MIME 类型,因此您应该查看应用程序的要求,并了解您为什么关心 MIME 类型、您想对它们“做什么”等。您可以使用文件扩展名来键入同样的行为?您是否还需要读取文件的前几个字节以确定其 MIME 类型?
【讨论】:
【参考方案18】:这个帮助类返回任何文件名的 mime 类型(内容类型)、描述和图标:
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 < 0)
return;
if (phiconSmall[0] != IntPtr.Zero)
smallIcon = (Icon)Icon.FromHandle(phiconSmall[0]).Clone();
DestroyIcon(phiconSmall[0]);
if (phiconLarge[0] != IntPtr.Zero)
largeIcon = (Icon)Icon.FromHandle(phiconLarge[0]).Clone();
DestroyIcon(phiconLarge[0]);
return;
finally
if (registryKey2 != null)
registryKey2.Close();
if (registryKey1 != null)
registryKey1.Close();
用法:
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
【讨论】:
不幸的是,这不能跨平台工作,并且由于它使用 RegistryKeys 很容易在云中造成麻烦【参考方案19】:如果您不想添加额外的依赖项并且仍然想要与版本无关的请求,您可以将this answer on how to get the MIME-Type in different .NET versions 与this answer on conditional builds for multiple .NET Framework versions 混合使用。
我做的第一件事是编辑我的项目文件。在最后一个构建定义之后,我添加了第二个答案中所述的属性组:
<PropertyGroup>
<DefineConstants Condition=" !$(DefineConstants.Contains(';NET')) ">$(DefineConstants);$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
<DefineConstants Condition=" $(DefineConstants.Contains(';NET')) ">$(DefineConstants.Remove($(DefineConstants.LastIndexOf(";NET"))));$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
</PropertyGroup>
现在,我为第一个答案中的 MimeExtensionHelper
提供了不同的实现,并为来自 .NET 4.5 或更高版本的所有客户端提供了一个额外的实现,只需调用 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
同样在 .NET 4.5 之前的版本中,静态 MimeMapping
类托管一个名为 _mappingDictionary
(类型为 MimeMapping.MimeMappingDictionaryBase
)的静态实例,您可以从 Reflection 请求该实例以添加新的 MIME 类型,这可能尚不支持。
【讨论】:
【参考方案20】:通过文件扩展计算的mime类型不一定总是正确的。
假设我可以保存扩展名为 .png 的文件,但文件格式可以设置为“ImageFormat.jpeg”。
所以在这种情况下,您将要计算的文件会给出不同的结果...它可能会导致文件比原始文件大。
如果您正在处理图像,则可以使用 imagecodecInfo 和 ImageFormat。
【讨论】:
【参考方案21】:Bryan Denny 上面的帖子对我不起作用,因为并非所有扩展在注册表中都有“内容类型”子键。我不得不按如下方式调整代码:
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;
现在它适用于所有已注册文件类型和未注册或通用文件类型(如 JPG 等)。
【讨论】:
【参考方案22】:我已经为 mime 类型和内容类型值编制了一个信誉良好的来源列表,这些值仅以文件扩展名为键(当前)。
nuget 包在这里https://www.nuget.org/packages/FTTLib.dll/
来源在这里https://github.com/brondavies/filetypetranslator/
这个库的设计目的是:
无外部依赖项 没有文件系统访问权限 内存占用小 简单的静态方法(没有扩展方法和可实例化的类) 不区分大小写 便携式 - 适用于针对任何 CLR (.NET 2.0+) 的应用程序【讨论】:
【参考方案23】:当然,为了将共同的完整性、动态性和可移植性的优势与最小的依赖相结合
您会将 Samuel Neff 的静态字典与特定于平台的查询结合起来,例如布莱恩·丹尼(Bryan Denny)。
例如Linux 下的命令行工具“xdg-mime”可能会做后面的部分。
【讨论】:
【参考方案24】:如果有人可以在 linux 上使用与 libmagic 中类似的功能会更好,因为我认为这是检测文件类型的更好方法,而不是中继文件的扩展名。
例如,如果我将文件从 mypicture.jpg 重命名为 mypicture.txt 在linux上,还是会报图片的 但是在这里使用这种方法,它将被报告为文本文件。
问候托马斯
【讨论】:
【参考方案25】:IANA 媒体类型
我希望微软能够一起制定他们的行业标准法案!对于其他人,任何感兴趣的人:
离散类型
申请:https://www.iana.org/assignments/media-types/media-types.xhtml#application 音频:https://www.iana.org/assignments/media-types/media-types.xhtml#audio 示例:https://www.iana.org/assignments/media-types/media-types.xhtml#examples 字体:https://www.iana.org/assignments/media-types/media-types.xhtml#font 图片:https://www.iana.org/assignments/media-types/media-types.xhtml#image 型号:https://www.iana.org/assignments/media-types/media-types.xhtml#model 文字:https://www.iana.org/assignments/media-types/media-types.xhtml#text 视频:https://www.iana.org/assignments/media-types/media-types.xhtml#video多部分类型
留言:https://www.iana.org/assignments/media-types/media-types.xhtml#message 多部分:https://www.iana.org/assignments/media-types/media-types.xhtml#multipart我想向有兴趣的人推荐阅读:MIME types (IANA media types)Mozilla 页面!内容非常丰富!
代码方面,上述每个链接都有一个 .csv 文件下载:https://www.iana.org/assignments/media-types/application.csv
正如这里已经指出的,字典或 ConcurrentDictionary 可能是下载并使用键值对填充字典的想法。
【讨论】:
【参考方案26】:FileExtension
处理文件扩展名而不是 Mime。用户可以更改文件扩展名,因此请检查 Mime。代码示例通过文件扩展名关联 Mime,这是错误的,不起作用。
需要获取contenttype
文件并根据文件扩展名检查表是否Mime contetType
这个文件。现在,如何获取文件的ContentType
?
因此使用 FileUpload 是:FileUpload.PostedFile.ContentType;
现在,如果我已经有文件,是否捕获了您的 ContentType?
【讨论】:
【参考方案27】:您可以使用 MimeMappings 类。我认为这是最简单的方法。我也导入了 MimeMappings。因为我觉得找到这些类的导入很麻烦。
import org.springframework.boot.web.server.MimeMappings;
MimeMappings mm=new MimeMappings();
String mimetype = mm.get(fileExtension);
System.out.println(mimetype);
【讨论】:
以上是关于从文件扩展名中获取 MIME 类型的主要内容,如果未能解决你的问题,请参考以下文章