Alternative à la méthode FindMimeFromData dans Urlmon.dll qui contient plus de types MIME

La méthode FindMimeFromData accessible via la DLL Windows Urlmon.dll est capable de déterminer le type MIME d’une donnée donnée stockée en mémoire, en considérant les 256 premiers octets du tableau d’octets, où ces données sont stockées.

Cependant, après avoir lu sa documentation, j’ai été amené à la détection de type MIME dans Windows Internet Explorer, où je pouvais trouver les types MIME que cette méthode est capable de reconnaître. Voir la liste . Comme vous pouvez le constater, cette méthode est limitée à 26 types MIME.

Je me demandais donc si quelqu’un pouvait m’indiquer une autre méthode avec davantage de types MIME, ou une autre méthode / classe si je pouvais inclure les types MIME que je jugerais opportuns.

Je vous remercie.

Je me demandais donc si quelqu’un pouvait m’indiquer une autre méthode avec davantage de types MIME, ou une autre méthode / classe si je pouvais inclure les types MIME que je jugerais opportuns.

J’utilise un hybride de Winista et URLMon pour détecter le format réel des fichiers téléchargés.

Téléchargez Winista: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx

Ou téléchargez le projet avec l’URLMon fall back ici: https://github.com/MeaningOfLights/MimeDetect

Détection Winista MIME

Supposons que quelqu’un renomme un fichier exe avec une extension jpg, vous pouvez toujours déterminer le format de fichier “réel” à l’aide de l’parsing binary. Il ne détecte ni les fichiers swf ni les fichiers flv, mais utilise pratiquement tous les autres formats connus. Vous pouvez obtenir un éditeur hexadécimal et append d’autres fichiers qu’il peut détecter.

Fichier Magic

Winista détecte le type MIME réel à l’aide d’un fichier XML “mime-type.xml” contenant des informations sur les types de fichier et les signatures utilisées pour identifier le type de contenu.eg:

   ausnd    midmidikar    mp3mp2mpga   

Lorsque Winista ne parvient pas à détecter le format de fichier réel, je recourt à la méthode URLMon:

 public class urlmonMimeDetect { [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)] private extern static System.UInt32 FindMimeFromData( System.UInt32 pBC, [MarshalAs(UnmanagedType.LPStr)] System.Ssortingng pwzUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, System.UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)] System.Ssortingng pwzMimeProposed, System.UInt32 dwMimeFlags, out System.UInt32 ppwzMimeOut, System.UInt32 dwReserverd ); public ssortingng GetMimeFromFile(ssortingng 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); ssortingng mime = Marshal.PtrToSsortingngUni(mimeTypePtr); Marshal.FreeCoTaskMem(mimeTypePtr); return mime; } catch (Exception e) { return "unknown/unknown"; } } } 

De l’intérieur de la méthode Winista, je retombe sur l’URLMon ici:

  public MimeType GetMimeTypeFromFile(ssortingng 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(); ssortingng urlmonMimeType = urlmonMimeDetect.GetMimeFromFile(filePath); if (!ssortingng.IsNullOrEmpty(urlmonMimeType)) { foreach (MimeType mimeType in types) { if (mimeType.Name == urlmonMimeType) { return mimeType; } } } return oMimeType; } 

Winista de netomatix . AFAIK est une réécriture C # basée sur un projet Java open source au début des années 2000. Prendre plaisir!

Vous pouvez également utiliser la méthode de registre ou la méthode .Net 4.5 mentionnée dans ce message auquel Paul Zahra est lié, mais Winista est le meilleur à mon humble avis.

METTRE À JOUR:

Pour les applications de bureau, vous constaterez peut-être que le WindowsAPICodePack fonctionne mieux:

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

Il existe de nombreuses solutions possibles dans cet article SO qui vous donneront au moins matière à reflection.

Il semble que le seul moyen de le faire est de le lire en binary, puis de faire une comparaison, que les types MIME soient déclarés codés de manière irréversible ou que vous vous fiez aux types / registres MIME disponibles de la machine.