Come devo rilevare il tipo MIME di un file caricato in ASP.NET?
Domanda
In che modo le persone solitamente rilevano il tipo MIME di un file caricato utilizzando ASP.NET?
Soluzione
nella pagina aspx:
<asp:FileUpload ID="FileUpload1" runat="server" />
nel codice sottostante (c#):
string contentType = FileUpload1.PostedFile.ContentType
Altri suggerimenti
Il codice precedente non fornirà il tipo di contenuto corretto se il file viene rinominato e caricato.
Per favore usa questo codice per questo
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();
}
Anche se aneesh ha ragione nel dire che il tipo di contenuto della richiesta HTTP potrebbe non essere corretto, non penso che valga la pena effettuare il marshalling per la chiamata non gestita.Se è necessario ricorrere alle mappature estensione-tipo mime, è sufficiente "prendere in prestito" il codice da System.Web.MimeMapping.cctor (utilizzare Reflector).Questo approccio del dizionario è più che sufficiente e non richiede la chiamata nativa.