Para contribuir con mis 5 centavos:
TL, DR
Uso MimetypesFileTypeMap y agrego cualquier mime que no está allí y lo necesito específicamente, en el archivo mime.types.
Y ahora, la lectura larga:
En primer lugar, la lista de tipos MIME es enorme , consulte aquí: https://www.iana.org/assignments/media-types/media-types.xhtml
Me gusta usar las instalaciones estándar proporcionadas por JDK primero, y si eso no funciona, iré a buscar otra cosa.
Determinar el tipo de archivo desde la extensión del archivo
Desde 1.6, Java tiene MimetypesFileTypeMap, como se señala en una de las respuestas anteriores, y es la forma más sencilla de determinar el tipo mime:
new MimetypesFileTypeMap().getContentType( fileName );
En su implementación de vainilla esto no hace mucho (es decir, funciona para .html pero no para .png). Sin embargo, es muy simple agregar cualquier tipo de contenido que pueda necesitar:
- Cree un archivo llamado 'mime.types' en la carpeta META-INF de su proyecto
- Agregue una línea para cada tipo de mime que necesite y la implementación predeterminada no proporciona (hay cientos de tipos de mime y la lista crece a medida que pasa el tiempo).
Las entradas de ejemplo para archivos png y js serían:
image/png png PNG
application/javascript js
Para el formato de archivo mime.types, vea más detalles aquí: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Determinar el tipo de archivo a partir del contenido del archivo
Desde 1.7, Java tiene java.nio.file.spi.FileTypeDetector , que define una API estándar para determinar un tipo de archivo en forma específica de implementación .
Para buscar el tipo mime para un archivo, simplemente use Archivos y haga esto en su código:
Files.probeContentType(Paths.get("either file name or full path goes here"));
La definición de API proporciona recursos que admiten la determinación del tipo de archivo MIME a partir del nombre del archivo o del contenido del archivo (bytes mágicos). Es por eso que el método probeContentType () arroja IOException, en caso de que una implementación de esta API utilice la ruta que se le proporciona para intentar abrir el archivo asociado.
Nuevamente, la implementación vainilla de esto (la que viene con JDK) deja mucho que desear.
En un mundo ideal en una galaxia muy, muy lejana, todas estas bibliotecas que intentan resolver este problema de tipo de archivo a mimo simplemente implementarían java.nio.file.spi.FileTypeDetector , colocarías el jar de la biblioteca de implementación preferida archivo en su classpath y eso sería todo.
En el mundo real, en el que necesita la sección TL, DR, debe encontrar la biblioteca con la mayoría de las estrellas al lado de su nombre y usarla. Para este caso en particular, no necesito uno (todavía;)).