Abrufen des Mime-Typs einer Datei in Java

1. Übersicht

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. Verwenden von Java 7

Beginnen wir mit Java 7, das die Methode Files.probeContentType (Pfad) 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 installierten FileTypeDetector- Implementierungen, um den MIME-Typ zu prüfen . Es ruft den probeContentType 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 von URLConnection

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

3.1. Verwenden von getContentType ()

Wir können die Methode getContentType () von URLConnection 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, dass er sehr langsam ist .

3.2. Verwenden von rateContentTypeFromName ()

Als nächstes wollen wir sehen, wie wir den rateContentTypeFromName () 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 interne FileNameMap , um den MIME-Typ aus der Erweiterung aufzulösen .

Wir haben auch die Möglichkeit, stattdessen rateContentTypeFromStream () zu verwenden, bei dem die ersten Zeichen des Eingabestreams verwendet werden, um den Typ zu bestimmen.

3.3. Verwenden von getFileNameMap ()

Eine schnellere Möglichkeit, den MIME-Typ mithilfe von URLConnection abzurufen, ist die Methode getFileNameMap () :

@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 von URLConnection verwendet werden. Diese Tabelle wird dann verwendet, um den Eingabedateityp aufzulösen.

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

In der Standardeinstellung die Klasse verwendet content-types.properties Datei in JRE_HOME / lib . Wir können es jedoch erweitern, indem wir eine benutzerspezifische Tabelle mit der Eigenschaft content.types.user.table angeben :

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

4. Verwenden von MimeTypesFileTypeMap

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 Dateiinstanz selbst als Parameter an die Funktion übergeben. Die Funktion mit der Dateiinstanz als Parameter ruft jedoch intern die überladene Methode auf, die den Dateinamen als Parameter akzeptiert.

Intern sucht diese Methode eine Datei mit dem Namen mime.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 MimetypesFileTypeMap- Instanz hinzugefügt
  2. . mime.types im Home-Verzeichnis des Benutzers
  3. /lib/mime.types
  4. Ressourcen mit dem Namen META-INF / mime.types
  5. Ressource mit dem Namen META-INF / mimetypes.default (normalerweise nur in der Datei activity.jar enthalten)

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

5. Verwenden von jMimeMagic

jMimeMagic ist eine restriktiv lizenzierte Bibliothek, mit der wir den MIME-Typ einer Datei abrufen 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 auf Maven Central.

Als nächstes werden wir untersuchen, wie man mit der Bibliothek arbeitet:

@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 einen Tika-Core, mit dem 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 Methode detect () , 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 die verschiedenen Strategien zum Abrufen des MIME-Dateityps angesehen. 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 immer bei GitHub verfügbar.