Je me demandais simplement comment la plupart des gens récupèrent un type MIME à partir d'un fichier en Java? Jusqu'à présent, j'ai essayé deux utilitaires: JMimeMagic
& Mime-Util
.
Le premier m'a donné des exceptions de mémoire, le second ne ferme pas correctement ses flux. Je me demandais simplement si quelqu'un d'autre avait une méthode / bibliothèque qu'ils utilisaient et fonctionnaient correctement?
Réponses:
Dans Java 7, vous pouvez maintenant simplement utiliser
Files.probeContentType(path)
.la source
null
pour.xml
,.png
et les.xhtml
fichiers. Je ne sais pas si je fais juste quelque chose d'horriblement mal, mais cela semble plutôt terrible.Malheureusement,
ne fonctionne pas, car cette utilisation de l'URL laisse un fichier verrouillé, de sorte qu'il est, par exemple, non supprimable.
Cependant, vous avez ceci:
et également les suivants, qui ont l'avantage d'aller au-delà de la simple utilisation d'une extension de fichier, et jettent un œil au contenu
Cependant, comme suggéré par le commentaire ci-dessus, le tableau intégré des types MIME est assez limité, ne comprenant pas, par exemple, MSWord et PDF. Donc, si vous voulez généraliser, vous devrez aller au-delà des bibliothèques intégrées, en utilisant, par exemple, Mime-Util (qui est une excellente bibliothèque, en utilisant à la fois l'extension de fichier et le contenu).
la source
FileInputStream
dansBufferedInputStream
fait partie essentielle - sinon leguessContentTypeFromStream
rendementnull
(passéInputStream
instance doit soutenir les marques)URLConnection
a un ensemble très limité de types de contenu qu'il reconnaît. Par exemple, il n'est pas en mesure de détecterapplication/pdf
.guessContentTypeFromName()
utilise le$JAVA_HOME/lib/content-types.properties
fichier par défaut . vous pouvez ajouter votre propre fichier étendu en changeant la propriété du systèmeSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
L'API JAF fait partie de JDK 6. Regardez le
javax.activation
package.Les classes les plus intéressantes sont
javax.activation.MimeType
- un détenteur de type MIME réel - etjavax.activation.MimetypesFileTypeMap
- une classe dont l'instance peut résoudre le type MIME en tant que chaîne pour un fichier:la source
getContentType(File)
états: Renvoie le type MIME de l'objet fichier. L'implémentation dans cette classe appellegetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
Avec Apache Tika, vous n'avez besoin que de trois lignes de code :
Si vous avez une console groovy, collez et exécutez ce code pour jouer avec:
Gardez à l'esprit que ses API sont riches, il peut analyser "n'importe quoi". Depuis tika-core 1.14, vous avez:
Voir les apidocs pour plus d'informations.
la source
new Tika().detect(file.toPath())
pour la détection basée sur l'extension du fichier plutôt que la détection basée sur le contenu du fichiernew Tika().detect(file.getPath())
, qui utilise uniquement l'extension de fichierApache Tika propose dans tika-core une détection de type mime basée sur des marqueurs magiques dans le préfixe de flux.
tika-core
ne récupère pas les autres dépendances, ce qui le rend aussi léger que l' utilitaire de détection de type MIME actuellement non entretenu .Exemple de code simple (Java 7), utilisant les variables
theInputStream
ettheFileName
Veuillez noter que MediaType.detect (...) ne peut pas être utilisé directement ( TIKA-1120 ). Plus d'indications sont fournies à https://tika.apache.org/0.10/detection.html .
la source
Metadata.RESOURCE_NAME_KEY
Peut également être omis (si vous n'en avez pas ou ne pouvez pas vous fier au nom d'origine), mais dans ce cas, vous obtiendrez un résultat erroné dans certains cas (documents de bureau par exemple).Si vous êtes un développeur Android, vous pouvez utiliser une classe utilitaire
android.webkit.MimeTypeMap
qui mappe les types MIME aux extensions de fichier et vice versa.L'extrait de code suivant peut vous aider.
la source
De roseindia :
la source
Si vous êtes bloqué avec java 5-6, alors cette classe d'utilité de produit open source servoy .
Vous avez seulement besoin de cette fonction
Il sonde les premiers octets du contenu et renvoie les types de contenu en fonction de ce contenu et non par extension de fichier.
la source
J'ai publié mon package Java SimpleMagic qui permet la détermination du type de contenu (type mime) à partir de fichiers et de tableaux d'octets. Il est conçu pour lire et exécuter les fichiers magiques de commande de fichier Unix (1) qui font partie de la plupart des configurations de système d'exploitation Unix.
J'ai essayé Apache Tika, mais il est énorme avec des tonnes de dépendances,
URLConnection
n'utilise pas les octets des fichiers etMimetypesFileTypeMap
ne regarde que les noms de fichiers.Avec SimpleMagic, vous pouvez faire quelque chose comme:
la source
Pour participer avec mes 5 cents:
TL, DR
J'utilise MimetypesFileTypeMap et j'ajoute tout mime qui n'est pas là et j'en ai spécifiquement besoin, dans le fichier mime.types.
Et maintenant, la longue lecture:
Tout d'abord, la liste des types MIME est énorme , voir ici: https://www.iana.org/assignments/media-types/media-types.xhtml
J'aime d'abord utiliser les installations standard fournies par JDK, et si cela ne fonctionne pas, je vais chercher autre chose.
Déterminer le type de fichier à partir de l'extension de fichier
Depuis 1.6, Java a MimetypesFileTypeMap, comme indiqué dans l'une des réponses ci-dessus, et c'est le moyen le plus simple de déterminer le type MIME:
Dans son implémentation vanilla, cela ne fait pas grand-chose (c'est-à-dire que cela fonctionne pour .html mais pas pour .png). Il est cependant très simple d'ajouter tout type de contenu dont vous pourriez avoir besoin:
Des exemples d'entrées pour les fichiers png et js seraient:
Pour le format de fichier mime.types, 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 du contenu du fichier
Depuis la version 1.7, Java a java.nio.file.spi.FileTypeDetector , qui définit une API standard pour déterminer un type de fichier de manière spécifique à l' implémentation .
Pour récupérer le type MIME pour un fichier, vous devez simplement utiliser Fichiers et le faire dans votre code:
La définition de l'API fournit des fonctionnalités qui prennent en charge la détermination du type de mime de fichier à partir du nom de fichier ou du contenu du fichier (octets magiques). C'est pourquoi probeContentType () méthode lève IOException, dans le cas où une implémentation de cette API utilise le chemin d'accès qui lui est fourni pour réellement essayer d'ouvrir le fichier qui lui est associé.
Encore une fois, l' implémentation vanilla de celle-ci (celle qui vient avec JDK) laisse beaucoup à désirer.
Dans un monde idéal dans une galaxie lointaine, très lointaine, toutes ces bibliothèques qui tentent de résoudre ce problème de type fichier à mime implémenteraient simplement java.nio.file.spi.FileTypeDetector , vous déposeriez dans le pot de la bibliothèque d'implémentation préférée fichier dans votre chemin de classe et ce serait tout.
Dans le monde réel, celui où vous avez besoin de la section TL, DR, vous devriez trouver la bibliothèque avec la plupart des étoiles à côté de son nom et l'utiliser. Pour ce cas particulier, je n'en ai pas besoin (encore;)).
la source
J'ai essayé plusieurs façons de le faire, y compris les premières dites par @Joshua Fox. Mais certains ne reconnaissent pas les mimetypes fréquents comme pour les fichiers PDF, et d'autres ne peuvent pas être fiables avec de faux fichiers (j'ai essayé avec un fichier RAR avec une extension changée en TIF). La solution que j'ai trouvée, comme le dit également @Joshua Fox de manière superficielle, consiste à utiliser MimeUtil2 , comme ceci:
la source
Il est préférable d'utiliser une validation à deux couches pour le téléchargement de fichiers.
Vous pouvez d'abord vérifier le mimeType et le valider.
Deuxièmement, vous devriez chercher à convertir les 4 premiers octets de votre fichier en hexadécimal, puis à le comparer avec les nombres magiques. Ce sera alors un moyen très sûr de vérifier les validations de fichiers.
la source
C'est la manière la plus simple que j'ai trouvée pour faire ceci:
la source
Si vous travaillez avec un servlet et si le contexte du servlet est à votre disposition, vous pouvez utiliser:
la source
getServletContext
?au printemps fichier MultipartFile ;
file.getContentType();
la source
si vous travaillez sur Linux OS, il y a une ligne de commande
file --mimetype
:ensuite
la source
Après avoir essayé plusieurs autres bibliothèques, je me suis installé avec mime-util.
la source
la source
Vous pouvez le faire avec une seule ligne: MimetypesFileTypeMap (). GetContentType (new File ("filename.ext")) . Regardez le code de test complet (Java 7):
Ce code produit la sortie suivante: text / plain
la source
la source
Je l'ai fait avec le code suivant.
la source
Apache Tika.
et Deux lignes de code.
Capture d'écran ci-dessous
la source