2008-09-17 8 views

Odpowiedz

22

na stronie aspx:

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

w związanym kodzie (C#):

string contentType = FileUpload1.PostedFile.ContentType 
12

Powyższy kod nie da poprawny typ zawartości, jeśli plik zostanie zmieniona i przesłany.

Proszę użyć tego kodu do tego

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

Podczas aneesh ma rację mówiąc, że typ zawartości żądania HTTP nie może być prawidłowa, nie sądzę, że przetaczanie dla niekontrolowana rozmowy warto to. Jeśli musisz cofnąć się do mapowania rozszerzeń na mimet, po prostu "pożycz" kod z System.Web.MimeMapping.cctor (użyj Reflector). To podejście słownikowe jest więcej niż wystarczające i nie wymaga połączenia natywnego.

+1

W tym momencie funkcja System.Web.MimeMapping.GetMimeMapping() jest jawna i można ją wywołać bezpośrednio. –