Есть ли способ получить ВСЕ типы MIME вместо написания огромного оператора case?

Я хочу заселить

Response.ContentType = "text/plain";

Откуда-то в сервере / сети / словаре ВСЕ возможные типы MIME в соответствии с расширением файла:

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

Кроме того, я должен переименовать файл (по крайней мере, если он будет загружен, поэтому я должен знать заранее, будет ли он открыт или нет).

6 ответов

Решение

Вы можете сохранить mime- тип при загрузке файла (FileUpload. PostedFile.ContentType) и отправить его при запросе файла.

Хм... почему? Вы не собираетесь возвращать контент всех возможных типов?

Вот список распространенных типов: http://www.webmaster-toolkit.com/mime-types.shtml. Нет списка, который бы включал "ВСЕ" типы просто потому, что любой поставщик приложений может создать пользовательский и связать его с пользовательским расширением.

Это будет зависеть от вашей платформы. Вот один для C# и IIS: http://blog.crowe.co.nz/archive/2006/06/02/647.aspx

В Powershell это одна строка:

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

Код в ссылке, размещенной Ричардом:

// 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);
}

Я написал небольшой класс на основе списка webmaster-toolkit.com. Это делается для того, чтобы избежать использования COM и маршрута IIS или любых ссылок IIS.

Он использует сериализованный список XML, который содержит около 400 миметипов, поэтому обычно этого более чем достаточно, если у вас нет действительно малоизвестных миметипов. В этом случае вы можете просто добавить в файл XML.

Полное решение можно найти здесь. Вот пример:

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

// Конвертировать в IISOle.MimeMap - требуется подключение к IISOle
// IISOle можно добавить в раздел ссылок в VS.NET, выбрав
// Добавить ссылку, выбрать вкладку COM, а затем найти
// Активный провайдер пространства имен DS

По моим поискам: (потерял ссылки, извините)

"Поставщик пространства имен Active DS IIS" является частью установки IIS.
После установки IIS вы увидите это в списке параметров.
Если вы не видите, он должен быть расположен в C:\windows\system32\inetsrv\adsiss.dll.

Чтобы установить IIS: нажмите "Пуск", "Настройка", "Панель управления", "Установка и удаление программ", "Установка и удаление компонентов Windows", выберите "Службы интернет-информации" (IIS).

Большая часть кода, который я видел, использует некоторую комбинацию из них:

используя System.IO; использование System.DirectoryServices; // Щелкните правой кнопкой мыши на References и добавьте его из.NET using System.Reflection; using System.Runtime.InteropServices; использование System.Collections; используя IISOle; using System.Collections.Specialized;

При добавлении ссылки пространство имен Active DS может находиться на вкладке COM.

Другие вопросы по тегам