如何从文件扩展名中获得MIME类型?


当前回答

您可以使用Apache的httpd提供的表。将其映射到函数、字典、列表等应该是很简单的。

另外,正如这里所看到的,extension->mime类型不一定是函数。每个文件扩展名可能有多种常见的MIME类型,所以你应该看看你的应用程序的需求,看看你为什么关心MIME类型,你想用它们“做什么”等等。您可以使用文件扩展名来确定相同的行为吗?您是否也需要读取文件的前几个字节来确定其MIME类型?

其他回答

为了让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);

如果你不想增加额外的依赖关系,并且仍然想要版本独立的请求,你可以把这个关于如何在不同的。net版本中获得MIME-Type的答案与这个关于多个。net框架版本的条件构建的答案混合在一起。

我做的第一件事是编辑我的项目文件。在最后一个构建定义之后,我添加了第二个答案中所述的属性组:

<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),您可以从反射请求该实例,以便添加可能还不支持的新的MIME-Types。

使用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

你可以使用mimemaps类。我认为这是最简单的方法。我也给出了mimemapping的导入。因为我觉得找这些类的导入很麻烦。

import org.springframework.boot.web.server.MimeMappings;    
MimeMappings mm=new MimeMappings();
String mimetype = mm.get(fileExtension);
System.out.println(mimetype);

你可以使用这个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;
}