2008-09-17 7 views

Respuesta

22

en la página aspx:

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

en el código subyacente (C#):

string contentType = FileUpload1.PostedFile.ContentType 
12

El código anterior no dará el tipo de contenido correcto si se cambia el nombre del archivo y subido.

Utilice este código para que

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

Mientras aneesh es correcto al decir que el tipo de contenido de la petición HTTP puede no ser correcta, no creo que la de clasificación para la llamada no administrado vale la pena eso. Si necesita volver a caer a asignaciones de extensión a MIME, simplemente "tomar prestado" el código de System.Web.MimeMapping.cctor (uso del reflector). Este enfoque de diccionario es más que suficiente y no requiere la llamada nativa.

+1

En este punto en el tiempo, la función System.Web.MimeMapping.GetMimeMapping() es pública y se puede llamar directamente. –

Cuestiones relacionadas