L'obtention d'Un Fichier de Type Mime En Java
Je me demandais juste comment la plupart des gens vont chercher un type mime à partir d'un fichier en Java? Jusqu'à présent, j'ai essayé deux utils: JMimeMagic
& Mime-Util
.
Le premier m'a donné de la mémoire exceptions, le deuxième ne ferme pas ses flux éteint correctement. Je me demandais juste si quelqu'un avait une méthode/de la bibliothèque qu'ils ont utilisé et travaillé correctement?
- Une bonne vue d'ensemble sur les bibliothèques est donné à rgagnon.com/javadetails/java-0487.html
- J'ai utilisé la classe qui a été publié comme une réponse ici: stackoverflow.com/a/10140531/293280
- Tika devrait être la réponse maintenant. Les autres réponses ci-dessous faire la lumière sur de nombreuses dépendances avec Tika, mais je ne vois aucun avec tika-core.
- lorsque nous utilisons TIka, il convertit le fichier et il n'est plus utilisable. Chaîne contentType = tika.détecter(est) .
Vous devez vous connecter pour publier un commentaire.
Dans Java 7, vous pouvez maintenant l'utiliser juste
Fichiers.probeContentType(chemin)
.null
pour.xml
,.png
, et.xhtml
fichiers. Je ne sais pas si je vais juste faire quelque chose de terriblement mal, mais qui semble plutôt terrible.application/x-zip-compressed
et l'autre senull
suite à l'appel de ce sur un fichier zip. Totalement fiable :\. Donc, étant donné que je veux que mon application pour basculer sur le schéma de codage d'un fichier (disons que mon application prend à la fois en XML et JSON de configuration), et le fichier est simplement appelé "configuration" (sans extension), quel est le moyen le plus fiable pour déterminer le type du fichier, sorte de tricherie et la lecture de quelques octets?Malheureusement,
ne fonctionne pas, puisque cette utilisation de l'URL feuilles d'un fichier verrouillé, de sorte que, par exemple, il est non effaçable située.
Cependant, vous avez ceci:
et aussi le suivant, qui a l'avantage d'aller au-delà de la simple utilisation de l'extension de fichier, et prend un coup d'oeil au contenu
Cependant, comme le suggère le commentaire ci-dessus, le tableau de mime-types est assez limité, pas y compris, par exemple, ms word et PDF. Donc, si vous voulez généraliser, vous aurez besoin d'aller au-delà de l'intégré dans des bibliothèques, à l'aide, par exemple, Mime-Util (qui est une grande bibliothèque, en utilisant à la fois l'extension de fichier et le contenu).
FileInputStream
enBufferedInputStream
est crucial partie - sinonguessContentTypeFromStream
retournenull
(passéInputStream
instance devrait soutenir les marques)URLConnection
a un ensemble très limité de types de contenu qu'il ne reconnaît. Par exemple, il n'est pas en mesure de détecterapplication/pdf
.guessContentTypeFromName()
utilise par défaut$JAVA_HOME/lib/content-types.properties
fichier. vous pouvez ajouter votre propre fichier étendu par l'évolution du système de propriétéSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
Mime-Util
??? J'ai trouvé projet dans github mais ne contient pas la description 🙁synchronized FileNameMap getFileNameMap
bonne chance dans le multithreadingLa FAC API fait partie du JDK 6. Regardez
javax.activation
paquet.La plupart des classes intéressantes sont
javax.activation.MimeType
- un réel type MIME titulaire - etjavax.activation.MimetypesFileTypeMap
- classe dont les instances ne peuvent résoudre type MIME comme une Chaîne de caractères d'un fichier:getContentType(File)
états: Retourne le type MIME du fichier objet.La mise en œuvre de cette classe appelsgetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
Avec Apache Tika vous avez seulement besoin de trois lignes de code:
Si vous avez une console groovy, il suffit de coller et d'exécuter ce code pour jouer avec elle:
Gardez à l'esprit que son Api est riche, il peut analyser "n'importe quoi". Comme de tika-core 1.14, vous avez:
Voir le apidocs pour plus d'informations.
new Tika().detect(file.toPath())
pour l'extension du fichier en fonction de détection plutôt que de la détection basée sur le contenu du fichiernew Tika().detect(file.getPath())
, qui n'utilise que l'extension du fichierApache Tika offre en tika-core un type mime basées sur la détection basée sur la magie des marqueurs dans le flux de préfixe.
tika-core
ne pas chercher d'autres dépendances, ce qui en fait le plus léger actuellement laissés à l'abandon Type Mime Utilitaire De Détection De.Simple exemple de code (Java 7), à l'aide de variables
theInputStream
ettheFileName
Veuillez noter que MediaType.détecter(...) ne peut pas être utilisé directement (TIKA-1120). Plus de conseils sont fournis à https://tika.apache.org/0.10/detection.html.
Metadata.RESOURCE_NAME_KEY
peut être omis (si vous n'en avez pas ou ne peut pas invoquer le nom d'origine), mais dans ce cas, vous obtiendrez un résultat incorrect dans certains cas (documents office par exemple).Si vous êtes un développeur Android, vous pouvez utiliser un utilitaire classe
android.webkit.MimeTypeMap
les cartes MIME-types pour les extensions de fichier et vice versa.Extrait de code suivant peut vous aider.
De roseindia:
Si vous êtes coincé avec java 5-6 alors cette classe utilitaire de servoy produit open source.
Vous avez seulement besoin de cette fonction
Il sonde les premiers octets du contenu et retourne les types de contenu basé sur le contenu et non pas par l'extension de fichier.
J'ai publié mon SimpleMagic package Java qui permet le type de contenu (mime-type) de détermination à partir des fichiers et des tableaux d'octets. Il est conçu pour lire et exécuter le fichier Unix(1) de commande de la magie des fichiers qui font partie de la plupart des ~OS Unix configurations.
J'ai essayé de Apache Tika, mais il est énorme avec des tonnes de dépendances,
URLConnection
n'utilise pas les octets des fichiers, etMimetypesFileTypeMap
aussi regarde juste à des noms de fichiers.Avec SimpleMagic vous pouvez faire quelque chose comme:
À puce avec mes 5 cents:
TL,DR
- Je utiliser MimetypesFileTypeMap et ajouter le mime qui n'est pas là et j'ai précisément besoin, en mime.types de fichiers.
Et maintenant, le long de lecture:
Tout d'abord, les types MIME liste est énorme, voir ici: https://www.iana.org/assignments/media-types/media-types.xhtml
J'aime utiliser les installations fournies par le JDK en premier, et si cela ne fonctionne pas, je vais aller chercher quelque chose d'autre.
Déterminer le type de fichier de l'extension de fichier
Depuis la 1.6, Java a MimetypesFileTypeMap, comme l'a fait observer dans l'une des réponses ci-dessus, et c'est la façon la plus simple de déterminer le type mime:
Dans sa vanille de mise en œuvre de cette ne fait pas beaucoup (c'est à dire qu'il travaille .html mais ce n'est pas pour .png). Cependant, il est super simple d'ajouter tout type de contenu que vous pourriez avoir besoin:
Exemple des entrées pour le png et fichiers js serait:
Pour le mime.types de format de fichier, voir plus de détails ici: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Déterminer le type de fichier à partir d'un fichier de contenu
Depuis 1.7, Java a java.nio.fichier.le spi.FileTypeDetector, qui définit une API standard pour déterminer un type de fichier dans de mise en œuvre de façon spécifique.
Pour aller chercher le type mime d'un fichier, vous pouvez tout simplement utiliser Fichiers et le faire dans votre code:
La définition de l'API fournit des installations qui prennent en charge pour déterminer le type mime du fichier à partir du nom de fichier ou à partir d'un fichier de contenu (magie octets). C'est pourquoi probeContentType() méthode throws IOException, dans le cas de la mise en œuvre de cette API utilise le Chemin d'accès fourni à vraiment essayer d'ouvrir le fichier associé.
Encore une fois, la vanille mise en œuvre de ce (celui qui est livré avec le JDK) laisse beaucoup à désirer.
Dans certains monde idéal, dans une galaxie loin, loin, tous ces bibliothèques qui tentent de résoudre ce fichier-à-mime-type de problème serait tout simplement de mettre en œuvre java.nio.fichier.le spi.FileTypeDetector, vous devez les déposer dans le préféré de mise en œuvre de la bibliothèque du fichier jar dans le classpath et que serait-il.
Dans le monde réel, celui où vous avez besoin de TL,DR section, vous devez vous trouver à la bibliothèque avec la plupart des étoiles à côté du nom et de l'utiliser. Pour ce cas particulier, je n'ai pas besoin d'un (encore 😉 ).
J'ai essayé plusieurs façons de le faire, y compris les premiers, dit par @Joshua Fox. Mais certains ne reconnaissent pas fréquentes mimetypes comme pour les fichiers PDF, et d'autres pourraient ne pas être dignes de confiance avec de faux fichiers (j'ai essayé avec un fichier RAR avec l'extension changé de TIF). La solution que j'ai trouvé, comme dit par @Joshua Fox de façon superficielle, est d'utiliser MimeUtil2, comme ceci:
Il est préférable d'utiliser deux couches de validation de téléchargement de fichiers.
D'abord, vous pouvez vérifier le type mime et de les valider.
Deuxième, vous devez chercher à convertir les 4 premiers octets de votre fichier en hexadécimal puis à les comparer avec les numéros de magie. Alors il sera vraiment sûr moyen de vérifier la validation de fichier.
au printemps MultipartFile fichier;
file.getContentType();
C'est la façon la plus simple que j'ai trouvé pour le faire:
si vous travaillez sur le système d'exploitation linux ,il y a une ligne de commande
file --mimetype
:Puis
Après avoir essayé divers autres bibliothèques, j'ai installé mime-util.
Vous pouvez le faire avec une seule ligne: MimetypesFileTypeMap().getContentType(new File("nom de fichier.ext")). Regarder le test complet (code Java 7):
Ce code génère le suivre de sortie: text/plain