2010-06-24 40 views
11

有沒有更好的方式來設置C#中的mimetypes比我試圖做的 在此先感謝。在C#中設置MimeType#

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 2010-06-24 16:05:45

+1

可能的重複[如何獲得在ASP.NET C#中請求的文件的MIME類型?](http://stackoverflow.com/questions/1302264/how-do-i-get-the-mime-type文件正在被請求在asp-net-c) – Lucero 2010-06-24 16:08:18

+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 2010-06-24 16:12:10

回答

15

我得到這個從this博文:

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 2010-06-24 16:12:25

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

Still需要硬編碼,但我認爲這個問題是關於使用現有的API而不是另一個實現。 – R0MANARMY 2010-06-24 16:08:48

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 2015-01-16 15:46:36