如何在ASP.NET中检测上载文件的MIME类型?
时间:2020-03-05 18:58:20 来源:igfitidea点击:
人们通常如何使用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(); }
回答
尽管aneesh正确地说HTTP请求的内容类型可能不正确,但我认为对非托管调用进行编组不值得。如果需要使用扩展名到模仿类型的映射,只需从System.Web.MimeMapping.cctor中"借用"代码(使用Reflector)。这种字典方法绰绰有余,不需要本地调用。