Java: Un moyen de faire correspondre Mime (contenu) type d'extension de fichier de CommonsMultipartFile
Dans mon entreprise, j'ai besoin de comparer le type mime du fichier d'extension pour la raison supplémentaire. J'ai un CommonsMultipartFile
. Je suis à essayer de comprendre la meilleure façon de faire cette comparaison. J'ai vu un MimetypesFileTypeMap
, mais vous ne savez pas si cela va fonctionner ici. J'essaie d'éviter (ou limiter) toute codage en dur.
- Je obtenir les valeurs en tant que telles:
CommonsMultipartFile file = ...;
String fileName = file.getOriginalFilename();
String contentType = file.getContentType();
String extension = FilenameUtils.getExtension(fileName);
J'apprécie tous les conseils et de l'aide sur ce. Merci!
- "J'essaie d'éviter (ou limiter) toute codage en dur." - J'ai essayé aussi 🙂
- Voulez-vous obtenir un type MIME à partir d'une extension, ou une extension d'un type MIME?
- Je veux juste assurez-vous que le type mime et l'extension de match. Donc je n'ai pas de soins de l'ordre.
Vous devez vous connecter pour publier un commentaire.
Bibliothèque Java pour ce cas est assez limitée (nombre de types). C'est comment je le fais:
l'étape 2 consiste à avoir une carte statique:
fonctionne très bien pour moi, l'espoir qui aide!
La méthode la plus fiable est d'utiliser Les fichiers.probeContentType, mais qui nécessite un fichier réel, en partie parce que tous les systèmes d'exploitation dépendent de l'extension de déterminer le type de fichier.
Dans Linux, la meilleure approche est
new MimetypesFileTypeMap("/etc/mime.types")
, qui va être vraiment basé sur le système de correspondances. Je ne sais pas si mac OS X est unmime.types
fichier (même si la recherche montre que TASSES pour OS X utilise un fichier de ce type, avec un renforcement, mais surtout la syntaxe de compatibilité descendante).Autant que je sache, il n'est pas intégré dans la classe Java pour arriver MIME-type↔mappages d'extension de Windows.
URLConnection.getFileNameMap()
renvoie une FileNameMap qui a un bon nombre d'entrées, mais tout n'est pas basé sur le système de correspondances. Sur mon système Linux, par exemple, il renvoie la valeur null .bz2 et .les fichiers rpm.FileTypeMap.getDefaultFileTypeMap()
semble avoir quelques entrées, mais il est clairement pas basée sur le système de correspondances. Au moins sur mon système, elle renvoie la valeur "application/octet-stream" pour .les fichiers png.Je pense que la meilleure chose à faire est d'encapsuler tous d'entre eux dans une classe:
Qui vous permettra d'obtenir d'assez bons résultats. Si vous voulez avoir une véritable plate-forme basée sur le type MIME de la vérification dans Windows, la seule façon que je sais faire c'est de lire le registre:
Files.probeContentType
semble détecter par l'extension de fichier seul. Moins utile dans les cas où l'extension de fichier est modifiée par l'utilisateur, etc. Le natiffile
commande semble être un meilleur choix, si disponible.J'ai une classe https://github.com/nablex/utils-io/blob/master/src/main/java/be/nabu/utils/io/ContentTypeMap.java qui fait cela.
Il ajoute que quelques-uns des choses qui sont absentes dans le URLConnection trucs:
En outre, il peut être branché dans le URLConnection à l'aide de:
Par défaut, il utilise un fichier à charger les mappages: https://github.com/nablex/utils-io/blob/master/src/main/resources/mime.properties