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)?

351voto

Chris Mowforth Punkte 6571

In Java 7 können Sie jetzt einfach Files.probeContentType(path) .

240voto

Joshua Fox Punkte 16940

Leider,

mimeType = file.toURL().openConnection().getContentType();

funktioniert nicht, da diese Verwendung von URL eine Datei sperrt, so dass sie z. B. nicht gelöscht werden kann.

Aber Sie haben das hier:

mimeType= URLConnection.guessContentTypeFromName(file.getName());

und auch die folgende, die den Vorteil hat, dass sie über die bloße Verwendung der Dateierweiterung hinausgeht und einen Blick auf den Inhalt wirft

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);
 //...close stream

Wie in dem obigen Kommentar angedeutet, ist die eingebaute Tabelle der MIME-Typen jedoch recht begrenzt und umfasst beispielsweise nicht MSWord und PDF. Wenn Sie also verallgemeinern wollen, müssen Sie über die eingebauten Bibliotheken hinausgehen und z. B. Mime-Util verwenden (eine großartige Bibliothek, die sowohl Dateierweiterung als auch Inhalt verwendet).

68voto

lifeisfoo Punkte 13648

Mit Apache Tika brauchen Sie nur drei Codezeilen :

File file = new File("/path/to/file");
Tika tika = new Tika();
System.out.println(tika.detect(file));

Wenn Sie eine Groovy-Konsole haben, fügen Sie einfach diesen Code ein und führen Sie ihn aus, um damit zu spielen:

@Grab('org.apache.tika:tika-core:1.14')
import org.apache.tika.Tika;

def tika = new Tika()
def file = new File("/path/to/file")
println tika.detect(file)

Denken Sie daran, dass seine APIs reichhaltig sind, es kann "alles" parsen. Ab tika-core 1.14, haben Sie:

String  detect(byte[] prefix)
String  detect(byte[] prefix, String name)
String  detect(File file)
String  detect(InputStream stream)
String  detect(InputStream stream, Metadata metadata)
String  detect(InputStream stream, String name)
String  detect(Path path)
String  detect(String name)
String  detect(URL url)

Véase die Apidocs für weitere Informationen.

54voto

Adam Hošek Punkte 755

Die JAF-API ist Teil des JDK 6. Blick auf javax.activation Paket.

Die interessantesten Klassen sind javax.activation.MimeType - ein tatsächlicher MIME-Typ-Inhaber - und javax.activation.MimetypesFileTypeMap - Klasse, deren Instanz den MIME-Typ als String für eine Datei auflösen kann:

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);

40voto

koppor Punkte 16743

Apache Tika Angebote in tika-core eine Erkennung des Mime-Typs auf der Grundlage der magischen Markierungen im Stream-Präfix. tika-core holt keine anderen Abhängigkeiten, was es so leichtgewichtig macht wie das derzeit nicht gewartete Dienstprogramm zur Mime-Type-Erkennung .

Einfaches Codebeispiel (Java 7), das die Variablen theInputStream y theFileName

try (InputStream is = theInputStream;
        BufferedInputStream bis = new BufferedInputStream(is);) {
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
    MediaType mediaType = detector.detect(bis, md);
    return mediaType.toString();
}

Bitte beachten Sie, dass MediaType.detect(...) kann nicht direkt verwendet werden ( TIKA-1120 ). Weitere Hinweise finden Sie unter https://tika.apache.org/1.24/detection.html .

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