如何在 ASP.NET 中检测上传文件的 MIME 类型?
题
人们通常如何使用 ASP.NET 检测上传文件的 MIME 类型?
解决方案
在 aspx 页面中:
<asp:FileUpload ID="FileUpload1" runat="server" />
在隐藏代码(c#)中:
string contentType = FileUpload1.PostedFile.ContentType
其他提示
如果文件被重命名并上传,上面的代码将不会给出正确的内容类型。
请使用此代码
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();
}
虽然 aaneesh 正确地说 HTTP 请求的内容类型可能不正确,但我认为非托管调用的编组不值得。如果您需要回退到扩展名到 mimetype 的映射,只需从 System.Web.MimeMapping.cctor 中“借用”代码即可(使用 Reflector)。这种字典方法已经足够了,并且不需要本机调用。
不隶属于 StackOverflow