有没有办法获得所有MIME类型而不是写一个巨大的case语句?

时间:2009-07-28 03:31:30

标签: asp.net mime-types

我想填充

Response.ContentType = "text/plain";

根据文件扩展名从服务器/网络/词典所有可能的MIME类型中的某处:

public string GetMimeType(string extension)
{
    //This is what I am looking for.    
}

另外,我必须重命名该文件(至少如果要下载,所以我必须事先知道它是否会被打开。

6 个答案:

答案 0 :(得分:4)

嗯......为什么?你不会回复所有类型的内容,不是吗?

以下是常见类型的列表: http://www.webmaster-toolkit.com/mime-types.shtml。没有包含“所有”类型的列表只是因为任何应用程序供应商都可以创建自定义类型并将其与自定义扩展关联。

答案 1 :(得分:4)

您可以在上传文件时存储mimetype(FileUpload。PostedFile.ContentType)并在请求文件时发送。

答案 2 :(得分:2)

这将取决于您的平台。这是C#和IIS的一个:http://blog.crowe.co.nz/archive/2006/06/02/647.aspx

在Powershell中,它是一个单行:

([adsi]"IIS://localhost/MimeMap").MimeMap

答案 3 :(得分:2)

Richard发布的链接中的代码:

// Maintain a sorted list to contain the MIME Types
SortedList sl = new SortedList();
Console.WriteLine("IIS Mime Map - c#");
Console.WriteLine();
// Serve to connect to...
string ServerName = "LocalHost";
// Define the path to the metabase
string MetabasePath = "IIS://" + ServerName + "/MimeMap";
// Note: This could also be something like
// string MetabasePath = "IIS://" + ServerName + "/w3svc/1/root";
try
{
  // Talk to the IIS Metabase to read the MimeMap Metabase key
  DirectoryEntry MimeMap = new DirectoryEntry(MetabasePath);
  // Get the Mime Types as a collection
  PropertyValueCollection pvc = MimeMap.Properties["MimeMap"];
  // Add each Mime Type so we can display it sorted later
  foreach (object Value in pvc)
  {
    // Convert to an IISOle.MimeMap - Requires a connection to IISOle
    // IISOle can be added to the references section in VS.NET by selecting
    // Add Reference, selecting the COM Tab, and then finding the 
    // Active DS Namespace provider
    IISOle.MimeMap mimetypeObj = (IISOle.MimeMap)Value;
    // Add the mime extension and type to our sorted list.
    sl.Add(mimetypeObj.Extension, mimetypeObj.MimeType);
  }
  // Render the sorted MIME entries
  if (sl.Count == 0)
    Console.WriteLine("No MimeMap entries are defined at {0}!", MetabasePath);
  else
    foreach (string Key in sl.Keys)
      Console.WriteLine("{0} : {1}", Key.PadRight(20), sl[Key]);
}
catch (Exception ex)
{
  if ("HRESULT 0x80005006" == ex.Message)
    Console.WriteLine(" Property MimeMap does not exist at {0}", MetabasePath);
  else
    Console.WriteLine("An exception has occurred: \n{0}", ex.Message);
}

答案 4 :(得分:1)

//转换为IISOle.MimeMap - 需要连接到IISOle
//通过选择
,可以将IISOle添加到VS.NET的引用部分 //添加引用,选择COM选项卡,然后找到
// Active DS命名空间提供程序

根据我的谷歌搜索:(丢失链接,抱歉)

“Active DS IIS命名空间提供程序”是IIS安装的一部分 安装IIS后,您将在选项列表中看到它 如果你没有看到它应该位于C:\ windows \ system32 \ inetsrv \ adsiss.dll。

安装IIS: 单击开始,设置,控制面板,添加或删除程序,添加或删除Windows组件,选择Internet信息服务(IIS)。

我见过的大多数代码都使用了这些代码的组合:

使用System.IO; 使用System.DirectoryServices; //右键单击References,然后从.NET添加它 使用System.Reflection; 使用System.Runtime.InteropServices; 使用System.Collections; 使用IISOle; 使用System.Collections.Specialized;

添加引用时,Active DS命名空间可能位于COM选项卡下。

答案 5 :(得分:1)

我根据webmaster-toolkit.com列表编写了一个小类。这是为了避免使用COM和IIS路由或任何IIS引用。

它使用包含大约400个mimetypes的XML序列化列表,因此除非你真的模糊了mimetypes,否则通常绰绰有余。在这种情况下,您只需添加到XML文件。

完整的解决方案can be found here。这是一个示例:

class Program
{
    static void Main(string[] args)
    {
        var list = MimeType.Load();
        MimeType mimetype = list.FirstOrDefault(m => m.Extension == "jpg");
    }
}