Alternativa al metodo FindMimeFromData in Urlmon.dll uno che ha più tipi MIME

Il metodo FindMimeFromData accessibile tramite la DLL di Windows Urlmon.dll è in grado di determinare il tipo MIME di un dato dato archiviato in memoria, considerando i primi 256 byte dell’array di byte, dove tali dati sono memorizzati.

Tuttavia, dopo aver letto la documentazione, sono stato condotto a MIME Type Detection in Windows Internet Explorer in cui sono riuscito a trovare i tipi MIME che questo metodo è in grado di riconoscere. Vedi la lista . Come puoi vedere, questo metodo è limitato a 26 tipi MIME.

Quindi mi chiedevo se qualcuno potesse indicarmi un altro metodo con più tipi MIME, o in alternativa un altro metodo / class sarei stato in grado di includere i tipi MIME che ritengo adatti.

Grazie.

Quindi mi chiedevo se qualcuno potesse indicarmi un altro metodo con più tipi MIME, o in alternativa un altro metodo / class sarei stato in grado di includere i tipi MIME che ritengo adatti.

Uso un ibrido di Winista e URLMon per rilevare il formato reale dei file caricati ..

Scarica Winista: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx

Oppure scarica il progetto con l’URL Risonalo qui: https://github.com/MeaningOfLights/MimeDetect

Winista MIME Detection

Se qualcuno rinomina un exe con un’estensione jpg, puoi comunque determinare il formato di file “reale” utilizzando l’analisi binaria. Non rileva swf o flv ma praticamente ogni altro formato noto + puoi ottenere un editor esadecimale e aggiungere altri file che può rilevare.

File Magic

Winista rileva il vero tipo MIME utilizzando un file XML “mime-type.xml” che contiene informazioni sui tipi di file e le firme utilizzate per identificare il tipo type.eg:

   ausnd    midmidikar    mp3mp2mpga   

Quando Winista non riesce a rilevare il formato di file reale, ho fatto ricorso al metodo URLMon:

 public class urlmonMimeDetect { [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)] private extern static System.UInt32 FindMimeFromData( System.UInt32 pBC, [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, System.UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed, System.UInt32 dwMimeFlags, out System.UInt32 ppwzMimeOut, System.UInt32 dwReserverd ); public string GetMimeFromFile(string filename) { if (!File.Exists(filename)) throw new FileNotFoundException(filename + " not found"); byte[] buffer = new byte[256]; using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) { if (fs.Length >= 256) fs.Read(buffer, 0, 256); else fs.Read(buffer, 0, (int)fs.Length); } try { System.UInt32 mimetype; FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0); System.IntPtr mimeTypePtr = new IntPtr(mimetype); string mime = Marshal.PtrToStringUni(mimeTypePtr); Marshal.FreeCoTaskMem(mimeTypePtr); return mime; } catch (Exception e) { return "unknown/unknown"; } } } 

Dall’interno del metodo Winista, ricado all’URLMon qui:

  public MimeType GetMimeTypeFromFile(string filePath) { sbyte[] fileData = null; using (FileStream srcFile = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { byte[] data = new byte[srcFile.Length]; srcFile.Read(data, 0, (Int32)srcFile.Length); fileData = Winista.Mime.SupportUtil.ToSByteArray(data); } MimeType oMimeType = GetMimeType(fileData); if (oMimeType != null) return oMimeType; //We haven't found the file using Magic (eg a text/plain file) //so instead use URLMon to try and get the files format Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect urlmonMimeDetect = new Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect(); string urlmonMimeType = urlmonMimeDetect.GetMimeFromFile(filePath); if (!string.IsNullOrEmpty(urlmonMimeType)) { foreach (MimeType mimeType in types) { if (mimeType.Name == urlmonMimeType) { return mimeType; } } } return oMimeType; } 

Winista da netomatix . AFAIK è una riscrittura C # basata su un progetto Java open source nei primi anni 2000. Godere!

Puoi anche utilizzare il metodo di registrazione o il metodo .Net 4.5 menzionato in questo post collegato a Paul Zahra, ma Winista è il migliore IMHO.

AGGIORNARE:

Per le applicazioni desktop è ansible che WindowsAPICodePack funzioni meglio:

 using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; private static string GetFilePropertyItemTypeTextValueFromShellFile(string filePathWithExtension) { var shellFile = ShellFile.FromFilePath(filePathWithExtension); var prop = shellFile.Properties.GetProperty(PItemTypeTextCanonical); return prop.FormatForDisplay(PropertyDescriptionFormatOptions.None); } 

Ci sono più soluzioni possibili in questo post SO che ti darà almeno un po ‘di spunti di riflessione.

Sembra che l’unico vero modo per farlo sia quello di leggerlo in binario e quindi fare un confronto, se i tipi MIME sono dichiarati hard-coded in qualche modo o si affidano ai propri MIME Type / Registry disponibili.