it-swarm-es.com

¿Cómo debo detectar el tipo MIME de un archivo cargado en ASP.NET?

¿Cómo suele detectar la gente el tipo MIME de un archivo cargado usando ASP.NET?

24
c.sokun

en la página aspx:

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

en el código subyacente (c #):

string contentType = FileUpload1.PostedFile.ContentType
24
Kinjal Dixit

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

Utilice este código para eso

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();
}
13
aneesh kumar

Si bien aneesh tiene razón al decir que el tipo de contenido de la solicitud HTTP puede no ser correcto, no creo que valga la pena la clasificación para la llamada no administrada. Si necesita recurrir a asignaciones de extensión a tipo mime, simplemente "pida prestado" el código de System.Web.MimeMapping.cctor (use Reflector). Este enfoque de diccionario es más que suficiente y no requiere la llamada nativa.

10
Richard Szalay