Per entrare con i miei 5 centesimi:
TL, DR
Uso MimetypesFileTypeMap e aggiungo qualsiasi mime che non c'è e ne ho specificamente bisogno, nel file mime.types.
E ora, la lunga lettura:
Prima di tutto, l'elenco dei tipi MIME è enorme , vedi qui: https://www.iana.org/assignments/media-types/media-types.xhtml
Mi piace usare prima i servizi standard forniti da JDK e, se non funziona, andrò a cercare qualcos'altro.
Determina il tipo di file dall'estensione del file
Dalla 1.6, Java ha MimetypesFileTypeMap, come indicato in una delle risposte sopra, ed è il modo più semplice per determinare il tipo mime:
new MimetypesFileTypeMap().getContentType( fileName );
Nella sua implementazione alla vaniglia questo non fa molto (cioè funziona per .html ma non per .png). Tuttavia, è super semplice aggiungere qualsiasi tipo di contenuto di cui potresti aver bisogno:
- Crea il file "mime.types" nella cartella META-INF nel tuo progetto
- Aggiungi una riga per ogni tipo di mime di cui hai bisogno e l'implementazione predefinita non fornisce (ci sono centinaia di tipi di mime e la lista cresce con il passare del tempo).
Le voci di esempio per i file png e js sarebbero:
image/png png PNG
application/javascript js
Per il formato file mime.types, vedi maggiori dettagli qui: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Determina il tipo di file dal contenuto del file
Dall'1.7, Java ha java.nio.file.spi.FileTypeDetector , che definisce un'API standard per determinare un tipo di file in modo specifico per l'implementazione .
Per recuperare il tipo mime per un file, devi semplicemente usare File e farlo nel tuo codice:
Files.probeContentType(Paths.get("either file name or full path goes here"));
La definizione dell'API fornisce funzionalità che supportano la determinazione del tipo di file mime dal nome del file o dal contenuto del file (byte magici). Questo è il motivo per cui il metodo probeContentType () genera IOException, nel caso in cui un'implementazione di questa API utilizzi il percorso fornito ad essa per provare effettivamente ad aprire il file ad esso associato.
Ancora una volta, l' implementazione vaniglia di questo (quello che viene fornito con JDK) lascia molto a desiderare.
In un mondo ideale in una galassia molto, molto lontano, tutte queste librerie che provano a risolvere questo problema di tipo file-to-mime implementerebbero semplicemente java.nio.file.spi.FileTypeDetector , lascerai cadere il vaso preferito della libreria di implementazione preferita file nel tuo percorso di classe e sarebbe così.
Nel mondo reale, quello in cui hai bisogno di TL, sezione DR, dovresti trovare la libreria con la maggior parte delle stelle accanto al suo nome e usarla. Per questo caso particolare, non ne ho bisogno (ancora;)).