Mit meinen 5 Cent einsteigen:
TL, DR
Ich benutze MimetypesFileTypeMap und füge jede , die nicht vorhanden ist und die ich speziell benötige, in die Datei mime.types ein.
Und jetzt die lange Lektüre:
Erstens ist die Liste der MIME-Typen riesig , siehe hier: https://www.iana.org/assignments/media-types/media-types.xhtml
Ich verwende gerne zuerst die von JDK bereitgestellten Standardeinrichtungen. Wenn dies nicht funktioniert, suche ich nach etwas anderem.
Bestimmen Sie den Dateityp anhand der Dateierweiterung
Seit 1.6 verfügt Java über MimetypesFileTypeMap, wie in einer der obigen Antworten angegeben, und es ist die einfachste Methode, den MIME-Typ zu bestimmen:
new MimetypesFileTypeMap().getContentType( fileName );
In seiner Vanilla-Implementierung macht dies nicht viel (dh es funktioniert für .html, aber nicht für .png). Es ist jedoch sehr einfach, einen beliebigen Inhaltstyp hinzuzufügen:
- Erstellen Sie eine Datei mit dem Namen 'mime.types' im Ordner META-INF in Ihrem Projekt
- Fügen Sie für jeden benötigten MIME-Typ eine Zeile hinzu, die von der Standardimplementierung nicht bereitgestellt wird (es gibt Hunderte von MIME-Typen, und die Liste wächst mit der Zeit).
Beispieleinträge für PNG- und JS-Dateien wären:
image/png png PNG
application/javascript js
Weitere Informationen zum Dateiformat mime.types finden Sie hier: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html
Bestimmen Sie den Dateityp anhand des Dateiinhalts
Java verfügt seit 1.7 über java.nio.file.spi.FileTypeDetector , das eine Standard-API zum Implementieren eines Dateityps auf implementierungsspezifische Weise definiert .
Um den MIME-Typ für eine Datei abzurufen, verwenden Sie einfach " Dateien" und tun dies in Ihrem Code:
Files.probeContentType(Paths.get("either file name or full path goes here"));
Die API-Definition bietet Funktionen, die entweder die Bestimmung des Dateimimetyps anhand des Dateinamens oder anhand des Dateiinhalts (magische Bytes) unterstützen. Deshalb ist probeContentType () -Methode eine IOException aus, falls eine Implementierung dieser API den bereitgestellten Pfad verwendet, um tatsächlich zu versuchen, die zugehörige Datei zu öffnen.
Auch hier lässt die Vanille- Implementierung (die mit JDK geliefert wird) zu wünschen übrig.
In einer idealen Welt in einer weit entfernten Galaxie würden all diese Bibliotheken, die versuchen, dieses Problem vom Typ Datei-zu-Pantomime zu lösen, einfach java.nio.file.spi.FileTypeDetector implementieren . Sie würden das Jar der bevorzugten implementierenden Bibliothek Datei in Ihren Klassenpfad und das wäre es.
In der realen Welt, in der Sie den Abschnitt TL, DR benötigen, sollten Sie die Bibliothek mit den meisten Sternen neben dem Namen finden und verwenden. Für diesen speziellen Fall brauche ich (noch;)) keinen.