2008-09-17 3 views

ответ

22

на странице ASPX:

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

в отделенного кода (C#):

string contentType = FileUpload1.PostedFile.ContentType 
12

Приведенный выше код не даст правильный тип содержимого, если файл переименован и загружен.

Пожалуйста, используйте этот код для этого

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

Хотя Aneesh правильно сказать, что тип содержимого запроса HTTP не может быть правильно, я не думаю, что сортировочные для неуправляемого вызова стоит Это. Если вам нужно вернуться к сопоставлениям с расширением до mimetype, просто «заимствуйте» код из System.Web.MimeMapping.cctor (используйте Reflector). Этот словарьный подход более чем достаточен и не требует нативного вызова.

+1

На данный момент функция System.Web.MimeMapping.GetMimeMapping() является общедоступной и может быть вызвана напрямую. – 2014-10-20 16:43:25

Смежные вопросы