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:
new MimetypesFileTypeMap().getContentType( fileName );
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:
- Créez un fichier nommé 'mime.types' dans le dossier META-INF de votre projet
- Ajoutez une ligne pour chaque type MIME dont vous avez besoin et l'implémentation par défaut ne fournit pas (il existe des centaines de types MIME et la liste s'allonge au fil du temps).
Des exemples d'entrées pour les fichiers png et js seraient:
image/png png PNG
application/javascript js
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:
Files.probeContentType(Paths.get("either file name or full path goes here"));
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;)).