如何从文件扩展名中获得MIME类型?
当前回答
你可以使用这个helper函数:
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;
}
其他回答
为了让Shimmy的回答更清楚:
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);
ASP。NET或其他
在ASP中,选项发生了一些变化。NET Core,在这里(学分):
新FileExtensionContentTypeProvider()。TryGetContentType(文件名,输出内容类型);(仅vNext) 从未测试过,但看起来您可以通过公开的Mappings属性正式展开mime类型列表。 使用MimeTypes NuGet包 从.NET Framework的引用源中复制mimemaps文件
对于。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)
我对这些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]);
}
}
}
我已经编写了一个程序来获取和转换Apache mime。类型文件到c#字典<字符串,字符串>的关键文件扩展名。这里的。
实际的输出是这个文件(但是您可能希望获取它并再次运行它,以防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" },
...
受到塞缪尔回答的启发,我写了一个改进版本:
当扩展名是大写时也适用。 以文件名为输入,优雅地处理没有扩展名的文件。 不要在键中包含“。”。 列表,为此我编写了一个小型转换脚本。
最终的源代码超过30K个字符,所以我不能张贴在这里,在Github上检查它。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?
- c#对象列表,我如何得到一个属性的和