Mime Type einer Datei in Java abrufen

Abrufen des Mime-Typs einer Datei in Java

1. Überblick

In diesem Tutorial werden verschiedene Strategien zum Abrufen von MIME-Dateitypen vorgestellt. Wir werden nach Möglichkeiten suchen, die verfügbaren MIME-Typen gegebenenfalls auf die Strategien auszudehnen.

Wir werden auch darauf hinweisen, wo wir eine Strategie der anderen vorziehen sollten.

2. Java 7 verwenden

Beginnen wir mit Java 7, das die MethodeFiles.probeContentType(path) zum Auflösen des MIME-Typs bereitstellt:

@Test
public void whenUsingJava7_thenSuccess() {
    Path path = new File("product.png").toPath();
    String mimeType = Files.probeContentType(path);

    assertEquals(mimeType, "image/png");
}

Diese Methode verwendet die implementiertenFileTypeDetector-Implementierungen, um den MIME-Typ zu prüfen. Es ruft dieprobeContentType jeder Implementierung auf, um den Typ aufzulösen.

Wenn die Datei nun von einer der Implementierungen erkannt wird, wird der Inhaltstyp zurückgegeben. Geschieht dies jedoch nicht, wird ein systemstandardisierter Dateitypdetektor aufgerufen.

Die Standardimplementierungen sind jedoch betriebssystemspezifisch und können je nach verwendetem Betriebssystem fehlschlagen.

Darüber hinaus ist zu beachten, dass die Strategie fehlschlägt, wenn die Datei nicht im Dateisystem vorhanden ist. Wenn die Datei keine Erweiterung hat, führt dies zu einem Fehler.

 3. Verwenden vonURLConnection

URLConnection bietet mehrere APIs zum Erkennen von MIME-Typen einer Datei. Lassen Sie uns jeden von ihnen kurz untersuchen.

3.1. Verwenden vongetContentType()

Wir können diegetContentType()-Methode vonURLConnection verwenden, um den MIME-Typ einer Datei abzurufen:

@Test
public void whenUsingGetContentType_thenSuccess(){
    File file = new File("product.png");
    URLConnection connection = file.toURL().openConnection();
    String mimeType = connection.getContentType();

    assertEquals(mimeType, "image/png");
}

Ein Hauptnachteil dieses Ansatzes ist jedoch, dassit’s very slow.

3.2. Verwenden vonguessContentTypeFromName()

Als nächstes wollen wir sehen, wie wir dieguessContentTypeFromName() für den folgenden Zweck verwenden können:

@Test
public void whenUsingGuessContentTypeFromName_thenSuccess(){
    File file = new File("product.png");
    String mimeType = URLConnection.guessContentTypeFromName(file.getName());

    assertEquals(mimeType, "image/png");
}

Diese Methode verwendet die internenFileNameMap bisresolve the MIME type from the extension.

Wir haben auch die Möglichkeit, stattdessenguessContentTypeFromStream() zu verwenden, wobei die ersten Zeichen des Eingabestreams verwendet werden, um den Typ zu bestimmen.

3.3. Verwenden vongetFileNameMap ()

Ein schnellerer Weg, um den MIME-Typ mitURLConnection zu erhalten, ist die MethodegetFileNameMap():

@Test
public void whenUsingGetFileNameMap_thenSuccess(){
    File file = new File("product.png");
    FileNameMap fileNameMap = URLConnection.getFileNameMap();
    String mimeType = fileNameMap.getContentTypeFor(file.getName());

    assertEquals(mimeType, "image/png");
}

Die Methode gibt die Tabelle der MIME-Typen zurück, die von allen Instanzen vonURLConnection. verwendet werden. Diese Tabelle wird dann zum Auflösen des Eingabedateityps verwendet.

Die integrierte Tabelle der MIME-Typen ist in Bezug aufURLConnection sehr begrenzt.

Standardmäßig istthe class uses content-types.properties Datei inJRE_HOME/lib. We can, however, extend it, by specifying a user-specific table using the content.types.user.table property:

System.setProperty("content.types.user.table","");

4. Verwenden vonMimeTypesFileTypeMap

MimeTypesFileTypeMap löst MIME-Typen mithilfe der Dateierweiterung auf. Diese Klasse wurde mit Java 6 geliefert und ist daher sehr praktisch, wenn wir mit JDK 1.6 arbeiten.

Nun wollen wir sehen, wie man es benutzt:

@Test
public void whenUsingMimeTypesFileTypeMap_thenSuccess() {
    File file = new File("product.png");
    MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
    String mimeType = fileTypeMap.getContentType(file.getName());

    assertEquals(mimeType, "image/png");
}

Hier können wir entweder den Namen der Datei oder die Instanz vonFileelbst als Parameter an die Funktion übergeben. Die Funktion mit der InstanzFileals Parameter ruft jedoch intern die überladene Methode auf, die den Dateinamen als Parameter akzeptiert.

Intern sucht diese Methode eine Datei mit dem Namenmime.types nach der Typauflösung. Es ist sehr wichtig zu beachten, dass die Methode in einer bestimmten Reihenfolge nach der Datei sucht:

  1. Programmgesteuert Einträge zur Instanz vonMimetypesFileTypeMaphinzugefügt

  2. .mime.types im Home-Verzeichnis des Benutzers

  3. /lib/mime.types

  4. Ressourcen mit dem NamenMETA-INF/mime.types

  5. Ressource mit dem NamenMETA-INF/mimetypes.default (normalerweise nur in der Dateiactivation.jar enthalten)

Wenn jedoch keine Datei gefunden wird, wirdapplication/octet-stream als Antwort zurückgegeben.

5. Verwenden von jMimeMagic

jMimeMagic ist eine restriktiv lizenzierte Bibliothek, mit der wir den MIME-Typ einer Datei erhalten können.

Beginnen wir mit der Konfiguration der Maven-Abhängigkeit:


    net.sf.jmimemagic
    jmimemagic
    0.1.5

Wir finden die neueste Version dieser Bibliothek aufMaven Central.

Als Nächstes werden wir untersuchen, wie Sie mit der Bibliothek arbeiten:

@Test
public void whenUsingJmimeMagic_thenSuccess() {
    File file = new File("product.png");
    Magic magic = new Magic();
    MagicMatch match = magic.getMagicMatch(file, false);

    assertEquals(match.getMimeType(), "image/png");
}

Diese Bibliothek kann mit einem Datenstrom arbeiten und erfordert daher nicht, dass die Datei im Dateisystem vorhanden ist.

6. Verwenden von Apache Tika

Apache Tika ist ein Toolset, das Metadaten und Text aus einer Vielzahl von Dateien erkennt und extrahiert. Es verfügt über eine umfangreiche und leistungsstarke API und enthälttika-core, mit denen wir den MIME-Typ einer Datei erkennen können.

Beginnen wir mit der Konfiguration der Maven-Abhängigkeit:


    org.apache.tika
    tika-core
    1.18

Als Nächstes verwenden wir die Methodedetect(), um den Typ aufzulösen:

@Test
public void whenUsingTika_thenSuccess() {
    File file = new File("product.png");
    Tika tika = new Tika();
    String mimeType = tika.detect(file);

    assertEquals(mimeType, "image/png");
}

Die Bibliothek verwendet für die Typauflösung magische Markierungen im Stream-Präfix.

7. Fazit

In diesem Artikel haben wir uns mit den verschiedenen Strategien zum Abrufen des MIME-Dateityps befasst. Darüber hinaus haben wir auch die Kompromisse der Ansätze analysiert. Wir haben auch die Szenarien aufgezeigt, in denen wir eine Strategie der anderen vorziehen sollten.

Der vollständige Quellcode, der in diesem Artikel verwendet wird, ist wie immerover at GitHub verfügbar.