Jak zwykle ludzie wykrywają typ MIME przesłanego pliku za pomocą ASP.NET?Jak wykryć typ MIME załadowanego pliku w ASP.NET?
20
A
Odpowiedz
22
na stronie aspx:
<asp:FileUpload ID="FileUpload1" runat="server" />
w związanym kodzie (C#):
string contentType = FileUpload1.PostedFile.ContentType
12
Powyższy kod nie da poprawny typ zawartości, jeśli plik zostanie zmieniona i przesłany.
Proszę użyć tego kodu do tego
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
Podczas aneesh ma rację mówiąc, że typ zawartości żądania HTTP nie może być prawidłowa, nie sądzę, że przetaczanie dla niekontrolowana rozmowy warto to. Jeśli musisz cofnąć się do mapowania rozszerzeń na mimet, po prostu "pożycz" kod z System.Web.MimeMapping.cctor (użyj Reflector). To podejście słownikowe jest więcej niż wystarczające i nie wymaga połączenia natywnego.
W tym momencie funkcja System.Web.MimeMapping.GetMimeMapping() jest jawna i można ją wywołać bezpośrednio. –