Ich habe mich nur gefragt, wie die meisten Leute einen MIME-Typ aus einer Datei in Java abrufen. Bisher habe ich zwei Utensilien ausprobiert: JMimeMagic
& Mime-Util
.
Das erste gab mir Speicherausnahmen, das zweite schließt seine Streams nicht richtig ab. Ich habe mich nur gefragt, ob jemand eine Methode / Bibliothek hat, die er verwendet und richtig funktioniert hat.
Antworten:
In Java 7 können Sie jetzt einfach verwenden
Files.probeContentType(path)
.quelle
null
Ausschau nach.xml
,.png
und.xhtml
Dateien. Ich weiß nicht, ob ich nur etwas schrecklich Falsches mache, aber das scheint ziemlich schrecklich.Unglücklicherweise,
funktioniert nicht, da diese Verwendung von URL eine Datei gesperrt lässt, so dass sie beispielsweise nicht löschbar ist.
Sie haben jedoch Folgendes:
und auch das Folgende, das den Vorteil hat, über die bloße Verwendung der Dateierweiterung hinauszugehen und einen Blick auf den Inhalt zu werfen
Wie aus dem obigen Kommentar hervorgeht, ist die integrierte Tabelle der MIME-Typen jedoch recht begrenzt, beispielsweise ohne MSWord und PDF. Wenn Sie also verallgemeinern möchten, müssen Sie über die integrierten Bibliotheken hinausgehen, z. B. Mime-Util (eine großartige Bibliothek, die sowohl die Dateierweiterung als auch den Inhalt verwendet).
quelle
FileInputStream
inBufferedInputStream
ist entscheidender Teil - ansonstenguessContentTypeFromStream
kehrtnull
(bestandenInputStream
Instanz sollte Marken unterstützen)URLConnection
jedoch nur eine sehr begrenzte Anzahl von Inhaltstypen, die erkannt werden. Zum Beispiel kann es nicht erkennenapplication/pdf
.guessContentTypeFromName()
verwendet die Standarddatei$JAVA_HOME/lib/content-types.properties
. Sie können Ihre eigene erweiterte Datei hinzufügen, indem Sie die Systemeigenschaft ändernSystem.setProperty("content.types.user.table","/lib/path/to/your/property/file");
Die JAF-API ist Teil von JDK 6. Sehen Sie sich das
javax.activation
Paket an.Die interessantesten Klassen sind
javax.activation.MimeType
- ein tatsächlicher MIME-Typinhaber - undjavax.activation.MimetypesFileTypeMap
- eine Klasse, deren Instanz den MIME-Typ als Zeichenfolge für eine Datei auflösen kann:quelle
getContentType(File)
Zustände: Gibt den MIME-Typ des Dateiobjekts zurück. Die Implementierung in dieser Klasse ruft aufgetContentType(f.getName())
.MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)
Mit Apache Tika benötigen Sie nur drei Codezeilen :
Wenn Sie eine groovige Konsole haben, fügen Sie einfach diesen Code ein und führen Sie ihn aus, um damit zu spielen:
Denken Sie daran, dass seine APIs reichhaltig sind und "alles" analysieren können. Ab Tika-Core 1.14 haben Sie:
Weitere Informationen finden Sie in den Apidocs .
quelle
new Tika().detect(file.toPath())
zur Erkennung der Dateierweiterung und nicht zur Erkennung anhand des Inhalts der Dateinew Tika().detect(file.getPath())
, die nur die Dateierweiterung verwendetApache Tika bietet im Tika-Core eine MIME-Typerkennung basierend auf magischen Markern im Stream-Präfix.
tika-core
ruft keine anderen Abhängigkeiten ab, wodurch es so leicht wie das derzeit nicht verwaltete Dienstprogramm zur Erkennung von MIME-Typen ist .Einfaches Codebeispiel (Java 7) unter Verwendung der Variablen
theInputStream
undtheFileName
Bitte beachten Sie, dass MediaType.detect (...) nicht direkt verwendet werden kann ( TIKA-1120 ). Weitere Hinweise finden Sie unter https://tika.apache.org/0.10/detection.html .
quelle
Metadata.RESOURCE_NAME_KEY
Kann auch weggelassen werden (wenn Sie keinen haben oder sich nicht auf den ursprünglichen Namen verlassen können), aber in diesem Fall erhalten Sie in einigen Fällen ein falsches Ergebnis (z. B. Bürodokumente).Wenn Sie ein Android-Entwickler sind, können Sie eine Dienstprogrammklasse verwenden,
android.webkit.MimeTypeMap
die MIME-Typen Dateierweiterungen zuordnet und umgekehrt.Das folgende Code-Snippet kann Ihnen helfen.
quelle
Von Roseindia :
quelle
Wenn Sie mit Java 5-6 nicht weiterkommen, können Sie diese Dienstprogrammklasse aus dem Open Source-Produkt servoy verwenden .
Sie benötigen nur diese Funktion
Es prüft die ersten Bytes des Inhalts und gibt die Inhaltstypen basierend auf diesem Inhalt und nicht nach Dateierweiterung zurück.
quelle
Ich habe mein SimpleMagic Java-Paket veröffentlicht, das die Bestimmung des Inhaltstyps ( MIME -Typ) aus Dateien und Byte-Arrays ermöglicht. Es dient zum Lesen und Ausführen der magischen Dateien für Unix-Dateien (1), die Teil der meisten ~ Unix-Betriebssystemkonfigurationen sind.
Ich habe Apache Tika ausprobiert, aber es ist riesig mit unzähligen Abhängigkeiten,
URLConnection
verwendet nicht die Bytes der Dateien und betrachtetMimetypesFileTypeMap
auch nur die Dateinamen.Mit SimpleMagic können Sie Folgendes tun:
quelle
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:
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:
Beispieleinträge für PNG- und JS-Dateien wären:
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:
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.
quelle
Ich habe verschiedene Möglichkeiten ausprobiert, einschließlich der ersten, die von @Joshua Fox gesagt wurden. Einige erkennen jedoch keine häufigen Mimetypen wie bei PDF-Dateien, andere können bei gefälschten Dateien nicht vertrauenswürdig sein (ich habe es mit einer RAR-Datei versucht, deren Erweiterung in TIF geändert wurde). Die Lösung, die ich gefunden habe, wie auch von @Joshua Fox oberflächlich gesagt, ist die Verwendung von MimeUtil2 wie folgt :
quelle
Es ist besser, die Zwei-Ebenen-Validierung für das Hochladen von Dateien zu verwenden.
Zuerst können Sie nach dem mimeType suchen und ihn validieren.
Zweitens sollten Sie versuchen, die ersten 4 Bytes Ihrer Datei in hexadezimal zu konvertieren und sie dann mit den magischen Zahlen zu vergleichen. Dann ist es eine wirklich sichere Möglichkeit, nach Dateivalidierungen zu suchen.
quelle
Dies ist der einfachste Weg, den ich dafür gefunden habe:
quelle
Wenn Sie mit einem Servlet arbeiten und der Servlet-Kontext für Sie verfügbar ist, können Sie Folgendes verwenden:
quelle
getServletContext
?im Frühjahr MultipartFile- Datei;
file.getContentType();
quelle
Wenn Sie unter Linux arbeiten, gibt es eine Befehlszeile
file --mimetype
:Dann
quelle
Nachdem ich verschiedene andere Bibliotheken ausprobiert hatte, entschied ich mich für mime-util.
quelle
quelle
Sie können dies mit nur einer Zeile tun: MimetypesFileTypeMap (). GetContentType (neue Datei ("filename.ext")) . Schauen Sie sich den vollständigen Testcode an (Java 7):
Dieser Code erzeugt die folgende Ausgabe: text / plain
quelle
quelle
Ich habe es mit folgendem Code gemacht.
quelle
Apache Tika.
und zwei Codezeilen.
Screenshot unten
quelle