2009-08-19 24 views
6

Tôi muốn xử lý các yêu cầu khác nhau tùy thuộc vào loại MIME. Ví dụ: tôi có tệp PDF, hình ảnh và phương tiện khác mà tôi muốn cấm truy cập dựa trên các loại MIME tương ứng của chúng. Có ý tưởng nào để làm việc này không? Cảm ơn đã giúp đỡ.Làm thế nào để nhận được loại MIME của một tập tin được yêu cầu trong ASP.NET C#?

Tôi cũng nên lưu ý rằng việc truy cập vào đăng ký Windows không phải là một tùy chọn cho ứng dụng của tôi.

+0

Đây có phải là đối hạn chế về thể tải những tập tin hoặc tải –

+0

Đây là đối để tải về và/hoặc viết lại URL. – mkelley33

Trả lời

10

ánh xạ mime-type NET của được lưu trữ trong lớp System.Web.MimeMapping mà cung cấp phương thức GetMimeMapping.

Trước .NET 4.5, lớp này được đánh dấu là internal và do đó không có sẵn cho mã của bạn. Trong trường hợp đó, tốt nhất bạn có thể làm là ăn cắp danh sách, mà bạn có thể nhận được bằng cách sử dụng Reflector và dịch ngược các constructor tĩnh (cctor).

Nếu sử dụng cách tiếp cận đó, bạn có thể nên tắt chỉ đơn giản là tạo danh sách các tiện ích được hỗ trợ và loại mime của chúng và lưu trữ nó trên từ điển. (Danh sách bên MimeMapping là một tad verbose)

+0

Đó chính xác là con đường tôi đã đi. Tôi chắc chắn rằng tôi đã bỏ lỡ một số phần mở rộng, nhưng họ rất có thể sẽ là trường hợp góc tốt nhất xử lý khi chúng phát sinh để đáp ứng yêu cầu "làm việc/phần mềm làm việc" LOL. Cám ơn vì sự gợi ý! Tôi chưa bao giờ biết về MimeMappings. Rất tuyệt! – mkelley33

+2

Tính đến 4,5, lớp học này đã được công khai! Với phương thức 'GetMimeMapping (string fileName)' thuận tiện. - http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping.aspx – Snixtor

0

Nếu tôi hiểu đúng câu hỏi của bạn, bạn đang phân phát tệp tĩnh và muốn xử lý yêu cầu tệp tĩnh để quyết định người dùng có quyền truy cập vào tệp đó hay không. (dựa trên loại MIME)

Nếu bạn ánh xạ tất cả các yêu cầu tệp qua IHttpHandler tùy chỉnh (xem phần trình xử lý tệp web.config của bạn), bạn sẽ có thể thực hiện việc này.

Trong ProcessRequest (hoặc BeginProcessRequest nếu bạn thực hiện một trình xử lý không đồng bộ), bạn có thể gọi HttpContext.Current.Server.MapPath ("~" + HttpContext.Current.Request.Path) (có thể là cách tốt hơn để làm điều đó) để yêu cầu tệp tĩnh hiện tại.

Sau đó, bạn có thể phân tích phần mở rộng của tệp đó để đưa ra quyết định của mình.

Không chắc chắn nếu thats những gì bạn muốn, nhưng hy vọng nó giúp

+0

Đó là rất gần với những gì tôi muốn, nhưng tôi đã hy vọng có một cách tự động hơn để làm điều đó, thay vì phân tích phần mở rộng. Một cái gì đó nhiều hơn dọc theo dòng Request.MIMEType. Cảm ơn về thông tin bạn vừa nhập! – mkelley33

1

thông tin này nằm trong registry, trong HKEY_CLASSES_ROOT\<file_extension>\Content Type

using(var key = Registry.ClassesRoot.OpenSubKey(".htm")) 
{ 
    string mimeType = key.GetValue("Content Type") as string; 
} 
+1

Cảm ơn bạn đã nhập, nhưng các yêu cầu kỹ thuật tôi đã đưa ra lệnh không truy cập đăng ký. – mkelley33

9

Tôi đã có một vấn đề tương tự một vài tháng trước đây và giải quyết nó với điều này wrapper lớp đơn giản xung quanh System.Web.MimeMapping (như đã đề cập bởi Richard Szalay):

/// <summary> 
/// This class allows access to the internal MimeMapping-Class in System.Web 
/// </summary> 
class MimeMappingWrapper 
{ 
    static MethodInfo getMimeMappingMethod; 

    static MimeMappingWrapper() { 
     // dirty trick - Assembly.LoadWIthPartialName has been deprecated 
     Assembly ass = Assembly.LoadWithPartialName("System.Web"); 
     Type t = ass.GetType("System.Web.MimeMapping"); 

     getMimeMappingMethod = t.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic); 
    } 

    /// <summary> 
    /// Returns a MIME type depending on the passed files extension 
    /// </summary> 
    /// <param name="fileName">File to get a MIME type for</param> 
    /// <returns>MIME type according to the files extension</returns> 
    public static string GetMimeMapping(string fileName) { 
     return (string)getMimeMappingMethod.Invoke(null, new[] { fileName }); 
    } 
} 
+1

Bất kỳ vấn đề nào với việc tránh sự xâm nhập bẩn bằng cách tham chiếu một loại công khai? 'Assembly.GetAssembly (typeof (System.Web.HttpApplication))'. Miễn là phương thức và loại tham chiếu không thay đổi hoặc biến mất, đó là ...? –

+6

Tôi thích tên biến của bạn cho hội. –

8

Cross-đăng tải từ Why would Reflection search suddenly not find anything?

các tin tốt là lớp MimeMapping và phương pháp GetMimeMapping của nó có vẻ như họ có thể được công bố trong .NET 4.5.

Tuy nhiên, điều này có nghĩa là mã được đưa ra trong số above answer sẽ bị ngắt vì nó chỉ tìm kiếm GetMimeMapping trong số các phương pháp NonPublic.

Để đảm bảo tính tương thích với .NET 4.5 (nhưng duy trì chức năng trong .NET 4.0 trở về trước), thay đổi ...

getMimeMappingMethod = t.GetMethod("GetMimeMapping", 
    BindingFlags.Static | BindingFlags.NonPublic); 

... để:

getMimeMappingMethod = t.GetMethod("GetMimeMapping", 
    BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
+0

đẹp ... dù tôi không hiểu. Tôi vẫn còn trên. NET 4 và chưa có khuôn khổ dường như cư xử như bạn mô tả (mà là như trong. NET 4.5) .. rất lạ – mare

+1

@mare bạn có thể có. NET 4.5 cài đặt - đó là một nâng cấp tại chỗ để hội đồng sẽ có mã mới lúc chạy nhưng VS hạn chế bạn tại thời gian biên dịch mã có sẵn cho .NET 4.0. –

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