À l'aide de .NET, comment pouvez-vous trouver le type mime d'un fichier basé sur le fichier de signature de ne pas l'extension
Je suis à la recherche d'un moyen simple d'obtenir un type mime où l'extension de fichier est incorrect ou n'est pas donné, quelque chose de semblable à cette question seulement dans .Net.
- Ce qui ressemble à cette question.
- Je souhaite que je pourrais supprimer tous les "fausses réponses" toujours utiliser l'extension de fichier lorsque l'exigence est clairement dit de NE PAS utiliser l'extension!
- Cela peut être une vieille question, mais le problème persiste. Je downvote chaque réponse ici, sur la base ils ne vérifiez les exécutables Windows, de par leur contenu; ce à propos de Linux ou iOS exécutables ou des fichiers dangereux ?
- Écrire une réponse pour ceux.
Vous devez vous connecter pour publier un commentaire.
Dans Urlmon.dll, il y a une fonction appelée
FindMimeFromData
.À partir de la documentation
Alors, lisez la suite de la première (jusqu'à) 256 octets dans le fichier et de le transmettre à
FindMimeFromData
.J'ai fait d'utiliser urlmon.dll en fin de compte. Je pensais qu'il y aurait un moyen plus facile, mais cela fonctionne. - Je inclure le code pour aider quelqu'un d'autre et de me permettre de me trouver à nouveau si j'en ai besoin.
...
J'ai trouvé un codées en dur solution, j'espère que je vais aider quelqu'un:
Path.GetExtension(fileName).Length > 1 &&
à votre situation afin d'éviter de s'écraser sur des fichiers qui n'ont pas d'extension.StringComparer.OrdinalIgnoreCase
le dictionnaire constructeur. Comparaison ordinale est plus rapide que l'invariant, et vous pourrez vous débarrasser de.ToLower()
et de ses variations.Unknown/unknown
est juste un mauvais type de contenu. Si vous ne souhaitez pas utiliserapplication/octet-stream
en tant que par défaut il devrait y avoir quelque chose qui ne correspond pas au format d'un type de contenu (tels que null) pour éviter de ne pas être attrapé et l'ont effectivement utilisé.Edit: il suffit d'utiliser Mime Détective
- Je utiliser le tableau d'octets séquences pour déterminer le type MIME d'un fichier donné. L'avantage de cette plus simplement en regardant l'extension de fichier le nom de fichier, c'est que si un utilisateur de renommer un fichier de contourner certains type de fichier restrictions de téléchargement, l'extension de nom de fichier ne parviendrait pas à attraper cette. D'autre part, l'obtention de la signature des fichiers via le tableau d'octets arrêtera cette espiègle comportement de se produire.
Voici un exemple en C#:
Avis que j'ai manipulé DOCX types de fichiers différemment depuis DOCX est vraiment juste un fichier ZIP. Dans ce scénario, j'ai tout simplement vérifier l'extension du fichier une fois que j'ai vérifié qu'il a de cette séquence. Cet exemple est loin d'être complète pour certaines personnes, mais vous pouvez facilement ajouter vos propres.
Si vous voulez ajouter plus de types MIME, vous pouvez obtenir le tableau d'octets séquences de nombreux types de fichiers à partir d'ici. Aussi, voici une autre bonne ressource concernant les signatures de fichiers.
Ce que je fais beaucoup de fois, si tout le reste échoue est l'étape par le biais de plusieurs fichiers d'un type particulier que je suis à la recherche pour et rechercher un motif dans la séquence d'octets des fichiers. En fin de compte, c'est toujours de vérification de base et ne peut être utilisé à 100% la preuve de la détermination des types de fichiers.
Si vous êtes en utilisant .NET Framework 4.5 ou au-dessus, il y a désormais un MimeMapping.GetMimeMapping(nom de fichier), méthode qui renvoie une chaîne de caractères avec le bon type Mime pour le nom de fichier passé. Notez que cette fonction utilise l'extension de fichier, pas de données dans le fichier lui-même.
De la Documentation est à http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Vous pouvez aussi rechercher dans le registre.
D'une manière ou d'une autre, vous allez avoir à puiser dans une base de données de MIMEs - si ils sont mappées à partir des extensions ou des numéros de magie est un peu trivial - registre de windows est un tel endroit.
Pour une plate-forme indépendante de la solution si l'on aurait navire de cette base avec le code (ou une bibliothèque autonome).
- Je utiliser une solution hybride:
.doc
fichier est.J'ai trouvé utile.
Pour VB.NET développeurs:
Je pense que la bonne réponse est une combinaison de Steve Morgan et Serguei réponses. C'est la façon dont Internet Explorer t-il. Pinvoke appel à
FindMimeFromData
fonctionne pour seulement 26 codée en dur de types mime. Aussi, il va donner ambiguë des types mime (commetext/plain
ouapplication/octet-stream
), même s'il peut exister un autre, plus précis, plus type mime approprié. Si elle ne parvient pas à donner un bon type mime, vous pouvez aller à la greffe pour les plus spécifiques, type mime. Le serveur de registre pourrait avoir plus up-to-date types mime.Se référer à: http://msdn.microsoft.com/en-us/library/ms775147(SV.85).aspx
Cette classe utiliser les réponses précédentes pour essayer de 3 façons différentes: harcoded basé sur l'extension, FindMimeFromData de l'API et de l'utilisation du registre.
Je suis tombé sur le même problème et l'a finalement opté pour mon propre saveur de Kirk Baucom la solution de trouvé ici.
Il me semble que c'est une chance pour quelqu'un d'écrire une ligne de recherche du service.
De toute façon, j'Espère que ça aide.
Si quelqu'un était ce qu'ils pouvaient porter l'excellent module perl Fichier::Type pour .NET. Dans le code est un ensemble de fichier d'en-tête de la magie numéro d'ups pour chaque type de fichier ou à l'expression rationnelle correspond.
Voici une .NET type de fichier de la détection de la bibliothèque http://filetypedetective.codeplex.com/ mais il ne détecte un petit nombre de fichiers pour le moment.
Cette réponse est une copie de la réponse de l'auteur (Richard Gourlay), mais l'amélioration de résoudre les problèmes sur IIS 8 /win2012 (où la fonction serait la cause de pool d'applications de crash), basé sur Rohland commentaire pointant vers http://www.pinvoke.net/default.aspx/urlmon.findmimefromdata
...
@Steve Morgan et @Richard Gourlay c'est une excellente solution, je vous remercie pour cela. Un petit inconvénient est que, lorsque le nombre d'octets dans un fichier est de 255 ou ci-dessous, le type mime parfois rendement "application/octet-stream", ce qui est légèrement inexacte pour les fichiers qui serait susceptible de donner "text/plain". J'ai mis à jour votre méthode originale pour tenir compte de cette situation comme suit:
Si le nombre d'octets dans le fichier est inférieure ou égale à 255 et le déduit type mime est "application/octet-stream", puis créez un nouveau tableau d'octets qui comprend le fichier d'origine octets répété n fois jusqu'à ce que le nombre total d'octets est >= 256. Puis re-vérifier le type mime sur ce nouveau tableau d'octets.
Méthode modifiée:
IIS 7 ou plus
Utiliser ce code, mais vous devez être l'administrateur sur le serveur
J'ai fini par utiliser Winista MimeDetector de Netomatix. Les sources peuvent être téléchargés gratuitement après avoir créé un compte: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Cette est une partie d'une autre réponse à votre question ici: Alternative à FindMimeFromData méthode Urlmon.dll celui qui a le plus de types MIME
La meilleure solution à ce problème, à mon avis.
Winista MIME de Détection avec URLMon télécharger le projet ici:
https://github.com/MeaningOfLights/MimeDetect
Dire quelqu'un renomme un fichier exe avec une extension jpg, vous pouvez toujours déterminer le "vrai" format de fichier Binaire à l'aide de l'Analyse. Il ne détecte pas les swf ou flv mais fait à peu près tous les autres bien connus format+, vous pouvez obtenir un éditeur hexadécimal et ajouter plus de fichiers qu'il peut détecter.
Fichier Magie
Winista détecte le vrai type MIME à l'aide d'un fichier XML "mime-type.xml" qui contient des informations sur les types de fichiers et les signatures utilisées pour identifier le type de contenu.par exemple:
Quand Winista échoue à détecter le vrai format de fichier, j'ai eu recours retour à la URLMon méthode:
De l'intérieur de la Winista méthode, je retombe sur la URLMon ici: