当您知道内容类型时如何获得正确的文件扩展名

Posted

技术标签:

【中文标题】当您知道内容类型时如何获得正确的文件扩展名【英文标题】:How to get correct file extension when you know content-type 【发布时间】:2011-08-19 17:52:59 【问题描述】:

我有一个包含文件数据的字节[]。数组可以包含多种不同文件类型的数据,例如 xml、jpg、html、csv 等。

我需要将该文件保存在磁盘中。

当您知道内容类型但不确定文件扩展名时,我正在寻找一个 c# 代码来找出正确的文件扩展名?

【问题讨论】:

这与您所要求的相反:gist.github.com/958009 ----您应该能够很容易地扭转它,这至少是一个不错的起点。 cyotek.com/article/display/mime-types-and-file-extensions 有一个 sn-p,它比反转 @Matt 的 sn-p 更容易使用。 @Matt Greer- 除非 OP 计划遍历 HKCR 中的每个扩展,否则这不是很有帮助。 编辑 我没有看到@Aurojit 的评论,这是一个更好的方法。 :) @Clack:内容类型的数量是有限的还是在编译时是未知的? 【参考方案1】:

http://cyotek.com/article/display/mime-types-and-file-extensions 有一个 sn-p 用于执行此操作,本质上是在 HKEY_CLASSES_ROOT\MIME\Database\Content Type\<mime type> 下的注册表中查找扩展名

【讨论】:

这当然意味着运行代码的计算机需要知道 MIME 类型/扩展信息,但这应该没问题。 嗯,它可能没问题,但也可能不太好。如果您是处理特定于应用程序的文件的 Web 服务器,例如Excel,您可能有一个未安装在 Web 服务器上的内容类型【参考方案2】:

也许这个转换器代码可以提供帮助:

        private static ConcurrentDictionary<string, string> MimeTypeToExtension = new ConcurrentDictionary<string, string>();
    private static ConcurrentDictionary<string, string> ExtensionToMimeType = new ConcurrentDictionary<string, string>();

    public static string ConvertMimeTypeToExtension(string mimeType)
    
        if (string.IsNullOrWhiteSpace(mimeType))
            throw new ArgumentNullException("mimeType");

        string key = string.Format(@"MIME\Database\Content Type\0", mimeType);
        string result;
        if (MimeTypeToExtension.TryGetValue(key, out result))
            return result;

        RegistryKey regKey;
        object value;

        regKey = Registry.ClassesRoot.OpenSubKey(key, false);
        value = regKey != null ? regKey.GetValue("Extension", null) : null;
        result = value != null ? value.ToString() : string.Empty;

        MimeTypeToExtension[key] = result;
        return result;
    

    public static string ConvertExtensionToMimeType(string extension)
    

        if (string.IsNullOrWhiteSpace(extension))
            throw new ArgumentNullException("extension");

        if (!extension.StartsWith("."))
            extension = "." + extension;

        string result;
        if (ExtensionToMimeType.TryGetValue(extension, out result))
            return result;

        RegistryKey regKey;
        object value;

        regKey = Registry.ClassesRoot.OpenSubKey(extension, false);
        value = regKey != null ? regKey.GetValue("Content Type", null) : null;
        result = value != null ? value.ToString() : string.Empty;

        ExtensionToMimeType[extension] = result;
        return result;
    

这个想法的起源来自这里: Snippet: Mime types and file extensions

【讨论】:

以上是关于当您知道内容类型时如何获得正确的文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

从扩展生成内容类型标头

PHP 是不是具有在给定有效内容类型的情况下返回正确文件扩展名的函数?

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

如何在不基于扩展的 IOS 中获取 Mime 类型

未指定此类标头时,浏览器如何知道内容类型?

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?