2010-06-24 19 views
11

Có cách nào tốt hơn để đặt mimetypes trong C# so với cái tôi đang cố gắng làm cảm ơn trước không.Đặt MimeType trong 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

tôi vẫn không hiểu tại sao các bộ sưu tập lớn các loại MIME mà MS sử dụng trong System.Web chưa được làm sẵn có của tôi làm cho public class nội bộ. .. tất cả mọi người được mã hóa phương pháp riêng của họ để có được loại mime của một tên tập tin và chỉ rất ít người thực sự làm điều đó đúng. – Lucero

+1

có thể trùng lặp của [Làm cách nào để nhận được loại MIME của tệp được yêu cầu trong ASP.NET C#?] (Http://stackoverflow.com/questions/1302264/how-do-i-get-the-mime-type -of-a-file-được-yêu cầu-in-asp-net-c) – Lucero

+1

Ngoài ra còn có [Sử dụng .NET, làm thế nào bạn có thể tìm thấy loại mime của một tập tin dựa trên chữ ký tập tin không phải là phần mở rộng. ] (http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-signature) – R0MANARMY

Trả lời

15

Tôi nhận này từ 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

Tôi sẽ đề xuất đăng ký. Tuy nhiên nếu bạn đang chạy ở chế độ tin cậy một phần, tôi nghĩ bạn cần cấp quyền truy cập đăng ký một cách rõ ràng, nó sẽ bị từ chối. Tôi có lẽ cũng sẽ lưu trữ các yêu cầu trong ứng dụng của bạn thay vì truy vấn mỗi lần nhưng đó là nhiều hơn từ nói chung unease gọi ra để đăng ký chứ không phải là dữ liệu cứng. Có lẽ cũng có giá trị chỉ ra: chứ không phải là ứng dụng/không rõ, IIS sẽ từ chối phục vụ một tập tin nếu không có loại nội dung đăng ký. – Rup

3

Nếu bạn không có quyền truy cập đăng ký hoặc không muốn sử dụng sổ đăng ký, bạn luôn có thể sử dụng từ điển cho điều đó.

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

Sau đó sử dụng:

string mimeType = mimeTypes[fileExtension]; 

Bên cạnh đó, bạn có thể lưu trữ những ánh xạ trong một tập tin XML và bộ nhớ cache chúng với một sự phụ thuộc tập tin, hơn là giữ chúng trong mã của bạn.

+1

Vẫn còn cần phải được hardcoded mặc dù, tôi nghĩ rằng câu hỏi là về cách sử dụng một API hiện có hơn là có một thực hiện khác. – R0MANARMY

4

Một Dictionary<String,String> có thể chứng minh được rõ ràng hơn.

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

Chỉ cần một dòng này để thực hiện việc này.

System.Web.MimeMapping.GetMimeMapping(FileName) 

Lưu ý: Đó là .NET 4.5+ chỉ

+0

Bạn có thể muốn bao gồm nhận xét của Rup trong câu trả lời của bạn (liên kết đến tài liệu và đó là 4.5+). – R0MANARMY

Các vấn đề liên quan