2008-09-17 14 views

Trả lời

22

trong trang aspx:

<asp:FileUpload ID="FileUpload1" runat="server" /> 

trong codebehind (C#):

string contentType = FileUpload1.PostedFile.ContentType 
12

Đoạn mã trên sẽ không cung cấp loại nội dung chính xác nếu tập tin được đổi tên và tải lên.

Vui lòng sử dụng mã này cho rằng

using System.Runtime.InteropServices; 

[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)] 
static extern int FindMimeFromData(IntPtr pBC, 
    [MarshalAs(UnmanagedType.LPWStr)] string pwzUrl, 
    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1, SizeParamIndex = 3)] byte[] pBuffer, 
    int cbSize, 
    [MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed, 
    int dwMimeFlags, out IntPtr ppwzMimeOut, int dwReserved); 

public static string getMimeFromFile(HttpPostedFile file) 
{ 
    IntPtr mimeout; 

    int MaxContent = (int)file.ContentLength; 
    if (MaxContent > 4096) MaxContent = 4096; 

    byte[] buf = new byte[MaxContent]; 
    file.InputStream.Read(buf, 0, MaxContent); 
    int result = FindMimeFromData(IntPtr.Zero, file.FileName, buf, MaxContent, null, 0, out mimeout, 0); 

    if (result != 0) 
    { 
     Marshal.FreeCoTaskMem(mimeout); 
     return ""; 
    } 

    string mime = Marshal.PtrToStringUni(mimeout); 
    Marshal.FreeCoTaskMem(mimeout); 

    return mime.ToLower(); 
} 
10

Trong khi Aneesh là đúng khi nói rằng kiểu nội dung của yêu cầu HTTP có thể không đúng, tôi không nghĩ rằng marshalling cho cuộc gọi không được quản lý có giá trị nó. Nếu bạn cần phải quay trở lại ánh xạ mở rộng đến mimetype, chỉ cần "mượn" mã từ System.Web.MimeMapping.cctor (sử dụng Reflector). Cách tiếp cận từ điển này là quá đủ và không yêu cầu gọi gốc.

+1

Tại thời điểm này, hàm System.Web.MimeMapping.GetMimeMapping() là công khai và có thể được gọi trực tiếp. –