gpt4 book ai didi

.net - .NET 中的文件扩展名和 MIME 类型

转载 作者:行者123 更新时间:2023-12-03 05:56:11 24 4
gpt4 key购买 nike

我想从给定的扩展名获取 MIME 内容类型(最好不访问物理文件)。我已经看到了一些与此相关的问题,并且可以在以下位置恢复描述的执行此操作的方法:

  1. 使用registry information .
  2. 使用urlmon.dll's FindMimeFromData .
  3. 使用IIS information .
  4. 推出您自己的 MIME 映射函数。基于this table ,例如。

我已经使用no.1有一段时间了,但我意识到注册表提供的信息并不一致,并且取决于机器上安装的软件。某些扩展名(例如 .zip)不用于指定内容类型。

解决方案 2 迫使我将文件放在磁盘上才能读取第一个字节,这虽然很慢,但可能会得到很好的结果。

第三种方法基于目录服务和所有这些东西,这是我不太喜欢的方法,因为我必须添加 COM 引用,而且我不确定它在 IIS6 和 IIS7 之间是否一致。另外,我不知道这个方法的性能。

最后,我不想使用自己的表,但如果我想要良好的性能和平台(甚至 Mono)之间结果的一致性,最后似乎是最好的选择。

您认为有比使用我自己的表更好的选择还是其他描述的方法之一更好?您的体验如何?

最佳答案

这取决于您需要 MIME 类型的用途。一般来说,对于服务(Web 应用程序、Web 服务等),建议不要使用依赖于操作系统设置的 MIME 列表,或者仅在无法找到 MIME 信息时作为后备。

我认为这也是 MS 选择将常量 MIME 类型放入其 System.Web.MimeMapping 类中的原因(不幸的是,无论出于何种原因,它是内部的)。

编辑:

包装器(<= .NET 3.5)

public static class MimeExtensionHelper
{
static object locker = new object();
static object mimeMapping;
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(mimeMapping, new object[] { filename });
}
}

包装器(.NET 4.0)

public static class MimeExtensionHelper
{
static object locker = new object();
static object mimeMapping;
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(mimeMapping, new object[] { filename });
}
}

.NET 4.5+

无需包装器,调用公共(public)方法System.Web.MimeMapping.GetMimeMapping直接。

关于.net - .NET 中的文件扩展名和 MIME 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1612767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com