Mọi người thường phát hiện loại MIME của tệp được tải lên bằng ASP.NET như thế nào?Tôi nên phát hiện loại MIME của tệp được tải lên trong ASP.NET như thế nào?
20
A
Trả lời
22
trong trang aspx:
<asp:FileUpload ID="FileUpload1" runat="server" />
trong codebehind (C#):
string contentType = FileUpload1.PostedFile.ContentType
12
Đoạn mã trên sẽ không cung cấp loại nội dung chính xác nếu tập tin được đổi tên và tải lên.
Vui lòng sử dụng mã này cho rằng
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
Trong khi Aneesh là đúng khi nói rằng kiểu nội dung của yêu cầu HTTP có thể không đúng, tôi không nghĩ rằng marshalling cho cuộc gọi không được quản lý có giá trị nó. Nếu bạn cần phải quay trở lại ánh xạ mở rộng đến mimetype, chỉ cần "mượn" mã từ System.Web.MimeMapping.cctor (sử dụng Reflector). Cách tiếp cận từ điển này là quá đủ và không yêu cầu gọi gốc.
Tại thời điểm này, hàm System.Web.MimeMapping.GetMimeMapping() là công khai và có thể được gọi trực tiếp. –