C# 通过内容类型获取文件扩展名

36

如何通过内容类型获取文件扩展名?

例如,我知道文件是"text/css",那么扩展名将为".css"。

private static string GetExtension(string contentType)
{
    string ext = ".";

    { DETERMINATION CODE IN HERE }

    return ext;
}

编写并填充已知类型的字典? - Konrad Kokosa
1
所有的踩是怎么回事? - Bradley Uffner
我认为下投票是因为发帖人要求我们为他编写代码,而不是发布尝试过的内容并提出具体问题。 - Craig W.
4
如果你甚至不知道从哪里开始,就很难编写你尝试过的代码。对我来说,这似乎是一个非常合理和具体的问题。 - Bradley Uffner
2个回答

63

[2019] .NET Core / Standard 兼容的可移植方法

虽然 Bradley 的答案在运行 .NET Framework 的普通 Windows 机器上依然完美,但是 Registry 是 Windows 特有的,当将应用程序移植到非 Windows 环境时会失败

幸运的是,这里有一个非常小的 NuGet 库,它基本上包含了一个官方 MIME 类型和相应扩展名的硬编码映射表,没有任何外部依赖项,在这里可以找到:https://github.com/samuelneff/MimeTypeMap。 它可以通过 NuGet 安装,如下所示:

MediaTypeMap

安装完包之后,调用它就很简单了:

MimeTypeMap.GetExtension("audio/wav")

您可以简单地按照您的示例操作:

private static string GetExtension(string contentType)
{
    return MimeTypes.MimeTypeMap.GetExtension(contentType);
}

5
这一行代码就是为什么我喜欢懒惰的开发者! - NoWar
3
很棒的东西完美运行,因为我的Web应用运行在Azure上,无法依赖注册表方法。 - Al Belmondo
没错,这个项目确实存在。但不幸的是,它的维护很糟糕。NuGet包现在已经过时了几年,与源代码的版本不匹配... - ice1e0

37
我所知道的“最佳”解决方案是查询注册表。你可以在这里找到示例代码。 http://cyotek.com/blog/mime-types-and-file-extensions
public static string? Extension(string mimeType)
{
    var key = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type\" + mimeType, false);
    var value = key?.GetValue("Extension", null);

    return value?.ToString();
}

请注意,这个解决方案只适用于Windows操作系统。只有在Windows上才支持RegistryKey.OpenSubKey(string, bool)方法。

1
using Microsoft.Win32; - Troy Gizzi
10
如果你从某个系统获取扩展文件并且该系统可以打开该文件,则此方法适用。对于xls文件,需要安装Excel等程序。 - mayowa ogundele
嗨@mayowa ogundele,如果系统无法打开文件,基于内容类型获取文件扩展名的替代解决方案是什么?我们不能使用字典,因为它不接受重复的键(因为内容类型会重复)。请建议...谢谢! - Bhargav
2
嗨,Bhargav,你可能想尝试一下Nuget的MediaTypeMap。请参见链接https://github.com/samuelneff/MimeTypeMap#getting-the-extension-to-a-mime-type。希望它对你有所帮助。 - mayowa ogundele
无法在不同操作系统上运行的.NET Core中工作。 - Saylent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接