2010-06-24 2 views
11

Есть ли лучший способ установить mimetypes в C#, чем тот, который я пытаюсь сделать заранее.Установка MimeType в C#

static String MimeType(string filePath) 
{ 
    String ret = null; 
    FileInfo file = new FileInfo(filePath); 

    if (file.Extension.ToUpper() == ".PDF") 
    { 
    ret = "application/pdf"; 
    } 
    else if (file.Extension.ToUpper() == ".JPG" || file.Extension.ToUpper() == ".JPEG") 
    { 
    ret = "image/jpeg"; 
    } 
    else if (file.Extension.ToUpper() == ".PNG") 
    { 
    ret = "image/png"; 
    } 
    else if (file.Extension.ToUpper() == ".GIF") 
    { 
    ret = "image/gif"; 
    } 
    else if (file.Extension.ToUpper() == ".TIFF" || file.Extension.ToUpper() == ".TIF") 
    { 
    ret = "image/tiff"; 
    } 
    else 
    { 
    ret = "image/" + file.Extension.Replace(".", ""); 
    } 

    return ret; 
} 
+2

я до сих пор не понимаю, почему большая коллекция типов MIME, который MS использует в System.Web не была предоставлена ​​мои делают внутренний открытый класс. .. каждый кодирует свой собственный метод, чтобы получить тип mime имени файла, и только очень немногие действительно делают это правильно. – Lucero

+1

Возможный дубликат [Как получить тип MIME файла, запрашиваемого в ASP.NET C#?] (Http://stackoverflow.com/questions/1302264/how-do-i-get-the-mime-type -of-a-file-being-request-in-asp-net-c) – Lucero

+1

Существует также [Использование .NET. Как вы можете найти тип mime файла на основе сигнатуры файла, а не расширения. ] (http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-signature) – R0MANARMY

ответ

15

Я получил это от this BlogPost:

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; 
} 
+2

Я собирался предложить реестр. Однако, если вы работаете в режиме частичного доверия, я думаю, вам нужно явно предоставить доступ к реестру, иначе ему будет отказано. Я бы, вероятно, также кэшировал запросы в приложении, а не запрашивал каждый раз, но это больше из-за общей неловкости обращения к реестру, а не к жестким данным. Возможно, также стоит отметить: вместо приложения/неизвестно, IIS откажется обслуживать файл, если нет типа содержимого реестра. – Rup

3

Если у вас нет доступа к реестру или вы не хотите использовать реестр, вы всегда можете использовать словарь для этого.

Dictionary<string,string> mimeTypes = new Dictionary<string,string>() { 
{ ".PDF","application/pdf"}, 
{ ".JPG", "image/jpeg" }, 
{ ".JPEG", "image/jpeg" } }; // and so on 

Затем используйте:

string mimeType = mimeTypes[fileExtension]; 

Кроме того, вы можете сохранить эти отображения в файле XML и кэшировать их в файл зависимостей, а не держать их в своем коде.

+1

Все еще должен быть жестко закодирован, хотя, я думаю, вопрос в том, чтобы использовать существующий API, а не иметь еще одну реализацию. – R0MANARMY

4

Dictionary<String,String> может оказаться более ясным.

private static Dictionary<String, String> mtypes = new Dictionary<string, string> { 
     {".PDF", "application/pdf" }, 
     {".JPG", "image/jpeg"}, 
     {".PNG", "image/png"}, 
     {".GIF", "image/gif"}, 
     {".TIFF","image/tiff"}, 
     {".TIF", "image/tiff"} 
    }; 

static String MimeType(String filePath) 
{ 
    System.IO.FileInfo file = new System.IO.FileInfo(filePath); 
    String filetype = file.Extension.ToUpper(); 
    if(mtypes.Keys.Contains<String>(filetype)) 
     return mtypes[filetype]; 
    return "image/" + filetype.Replace(".", "").ToLower(); 
} 
9

Для этого требуется только одна строка.

System.Web.MimeMapping.GetMimeMapping(FileName) 

Примечание: Это .NET 4.5+ только

+0

Возможно, вы захотите включить комментарий Rup в свой ответ (ссылка на документы и его 4.5 +). – R0MANARMY