24

人们通常如何使用 ASP.NET 检测上传文件的 MIME 类型?

4

3 回答 3

25

在 aspx 页面中:

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

在代码隐藏(c#)中:

string contentType = FileUpload1.PostedFile.ContentType
于 2008-09-17T09:04:40.593 回答
13

如果文件被重命名和上传,上面的代码将不会给出正确的内容类型。

请为此使用此代码

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();
}
于 2009-08-06T12:02:06.117 回答
10

虽然 aneesh 说 HTTP 请求的内容类型可能不正确是正确的,但我认为非托管调用的编组是不值得的。如果您需要回退到扩展到 mimetype 的映射,只需从 System.Web.MimeMapping.cctor 中“借用”代码(使用 Reflector)。这种字典方法绰绰有余,不需要本机调用。

于 2009-11-29T00:48:23.230 回答