383 Stimmen

Wie erhält man den Medientyp (MIME-Typ) einer Datei?

Wie kann man mit Java einen Medientyp (MIME-Typ) aus einer Datei ermitteln? Bislang habe ich JMimeMagic und Mime-Util ausprobiert. Das erste gab mir Speicherausnahmen, das zweite schließt seine Streams nicht richtig.

Wie würden Sie die Datei untersuchen, um ihren tatsächlichen Typ zu bestimmen (nicht nur anhand der Erweiterung)?

26voto

Pawan Punkte 1155

Wenn Sie ein Android-Entwickler sind, können Sie eine Utility-Klasse verwenden android.webkit.MimeTypeMap die MIME-Typen auf Dateierweiterungen abbildet und umgekehrt.

Der folgende Codeschnipsel könnte Ihnen helfen.

private static String getMimeType(String fileUrl) {
    String extension = MimeTypeMap.getFileExtensionFromUrl(fileUrl);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

20voto

AlikElzin-kilaka Punkte 31624

En roseindia :

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");

19voto

Gray Punkte 111812

Ich frage mich nur, wie die meisten Leute einen Mime-Type aus einer Datei in Java holen?

Ich habe meine SimpleMagic Java-Paket, das die Bestimmung des Inhaltstyps (mime-type) von Dateien und Byte-Arrays ermöglicht. Es wurde entwickelt, um die magischen Dateien des Unix-Befehls file(1) zu lesen und auszuführen, die Teil der meisten ~Unix-Betriebssystemkonfigurationen sind.

Ich habe Apache Tika ausprobiert, aber es ist riesig mit einer Vielzahl von Abhängigkeiten, URLConnection verwendet die Bytes der Dateien nicht, und MimetypesFileTypeMap schaut auch nur auf die Dateinamen.

Mit SimpleMagic können Sie so etwas tun wie:

// create a magic utility using the internal magic file
ContentInfoUtil util = new ContentInfoUtil();
// if you want to use a different config file(s), you can load them by hand:
// ContentInfoUtil util = new ContentInfoUtil("/etc/magic");
...
ContentInfo info = util.findMatch("/tmp/upload.tmp");
// or
ContentInfo info = util.findMatch(inputStream);
// or
ContentInfo info = util.findMatch(contentByteArray);

// null if no match
if (info != null) {
   String mimeType = info.getMimeType();
}

17voto

Ovidiu Buligan Punkte 2748

Wenn Sie mit Java 5-6 nicht weiterkommen dann ist diese Hilfsklasse von servoy Open-Source-Produkt .

Sie benötigen nur diese Funktion

public static String getContentType(byte[] data, String name)

Sie prüft die ersten Bytes des Inhalts und gibt die Inhaltstypen auf der Grundlage dieses Inhalts und nicht anhand der Dateierweiterung zurück.

8voto

nidalpres Punkte 3618

Um meine 5 Cents beizusteuern:

TL,DR

Ich benutze MimetypesFileTypeMap und fügen Sie alle Mime-Dateien, die dort nicht vorhanden sind und die ich speziell benötige, in die Datei mime.types ein.

Und jetzt, die lange Lektüre:

Zunächst einmal ist die Liste der MIME-Typen riesig , siehe hier: https://www.iana.org/assignments/media-types/media-types.xhtml

Ich verwende gerne zuerst die Standardfunktionen des JDK, und wenn das nicht funktioniert, suche ich nach etwas anderem.

Bestimmung des Dateityps anhand der Dateierweiterung

Seit 1.6 hat Java MimetypesFileTypeMap, wie in einer der Antworten oben erwähnt, und es ist der einfachste Weg, um Mime-Typ zu bestimmen:

new MimetypesFileTypeMap().getContentType( fileName );

In seiner Vanilla-Implementierung bringt dies nicht viel (d.h. es funktioniert für .html, aber nicht für .png). Es ist jedoch super einfach, jeden Inhaltstyp hinzuzufügen, den Sie benötigen:

  1. Erstellen Sie eine Datei namens 'mime.types' im META-INF-Ordner in Ihrem Projekt
  2. Fügen Sie eine Zeile für jeden Mime-Typ hinzu, den Sie benötigen und der in der Standardimplementierung nicht enthalten ist (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

Bestimmung des Dateityps anhand des Dateiinhalts

Seit 1.7 hat Java java.nio.file.spi.FileTypeDetector die eine Standard-API für die Bestimmung eines Dateityps in Implementierungsspezifische Art und Weise .

Um den Mime-Typ einer Datei abzurufen, verwenden Sie einfach Dateien und tun Sie dies in Ihrem Code:

Files.probeContentType(Paths.get("either file name or full path goes here"));

Die API-Definition sieht Einrichtungen vor, die entweder die Bestimmung des Mime-Typs einer Datei aus dem Dateinamen oder aus dem Dateiinhalt (magische Bytes) unterstützen. Aus diesem Grund probeContentType() Methode löst eine IOException aus, wenn eine Implementierung dieser API den ihr zur Verfügung gestellten Pfad verwendet, um zu versuchen, die damit verbundene Datei zu öffnen.

Nochmals, Vanille Umsetzung (die mit dem JDK mitgelieferte) lässt viel zu wünschen übrig.

In einer idealen Welt in einer weit, weit entfernten Galaxie würden all diese Bibliotheken, die versuchen, dieses File-to-Mime-Problem zu lösen, einfach Folgendes implementieren java.nio.file.spi.FileTypeDetector Sie würden die Jar-Datei der bevorzugten implementierenden Bibliothek in Ihren Klassenpfad einfügen und das war's.

In der realen Welt, in der Sie den TL,DR-Abschnitt brauchen, sollten Sie die Bibliothek mit den meisten Sternen neben ihrem Namen finden und sie benutzen. In diesem speziellen Fall brauche ich (noch ;) ) keine.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X