Есть ли способ получить ВСЕ типы 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.