webentwicklung-frage-antwort-db.com.de

Wie bekomme ich den MIME-Typ einer .MSG-Datei?

Ich habe diese Möglichkeiten ausprobiert, um den MIME-Typ einer Datei zu finden ...

Path source = Paths
                .get("C://Users/akash/Desktop/FW Internal release of MSTClient-Server5.02.04_24.msg");
        System.out.println(Files.probeContentType(source));

Der obige Code gibt null... zurück.
Und wenn ich die TIKA-API von Apache verwende, um den MIME-Typ zu erhalten, dann gibt es ihn als Text/Plain ...

Aber ich möchte das Ergebnis als application/vnd.ms-Outlook

UPDATE

Ich habe auch MIME-Util.jar wie folgt mit Code verwendet ...

MimeUtil2 mimeUtil = new MimeUtil2();
        mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
        RandomAccessFile file1 = new RandomAccessFile(
                "C://Users/akash/Desktop/FW Internal release of MSTClient-Server5.02.04_24.msg",
                "r");
        System.out.println(file1.length());
        byte[] file = new byte[624128];
        file1.read(file, 0, 624128);
        String mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file)).toString();

Dies gibt mir die Ausgabe als application/msword

UPDATE:

Tika-API ist nicht in ihrem Umfang, da sie zu groß ist, um sie in das Projekt aufzunehmen ...

Wie finde ich den MIME-Typ?

19
CoderNeji

Ich habe einige der möglichen Wege ausprobiert, und mit tika erhalten Sie das erwartete Ergebnis. Ich kann den von Ihnen verwendeten Code nicht sehen, sodass ich ihn nicht noch einmal überprüfen kann.

Ich habe verschiedene Möglichkeiten ausprobiert, nicht alle im Code-Snippet:

  1. Java 7 Files.probeContentType(path)
  2. URLConnection mime-Erkennung aus dem Ermitteln von Dateinamen und Inhaltstyp 
  3. JDK 6 JAF API javax.activation.MimetypesFileTypeMap
  4. MimeUtil mit allen verfügbaren Unterklassen von MimeDetector, die ich gefunden habe
  5. Apache Tika
  6. Apache-POI-Notizblock

Hier die Testklasse:

import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.InputStream;
import Java.net.URLConnection;
import Java.util.Collection;

import javax.activation.MimetypesFileTypeMap;

import org.Apache.tika.detect.Detector;
import org.Apache.tika.metadata.Metadata;
import org.Apache.tika.mime.MediaType;
import org.Apache.tika.parser.AutoDetectParser;

import eu.medsea.mimeutil.MimeUtil;

public class FindMime {

    public static void main(String[] args) {
        File file = new File("C:\\Users\\qwerty\\Desktop\\test.msg");

        System.out.println("urlConnectionGuess " + urlConnectionGuess(file));

        System.out.println("fileContentGuess " + fileContentGuess(file));

        MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

        System.out.println("mimeTypesMap.getContentType " + mimeTypesMap.getContentType(file));

        System.out.println("mimeutils " + mimeutils(file));

        System.out.println("tika " + tika(file));

    }

    private static String mimeutils(File file) {
        try {
            MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
            MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.ExtensionMimeDetector");
//          MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.OpendesktopMimeDetector");
            MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector");
//          MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.TextMimeDetector");
            InputStream is = new BufferedInputStream(new FileInputStream(file));
            Collection<?> mimeTypes = MimeUtil.getMimeTypes(is);
            return mimeTypes.toString();
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }

    private static String tika(File file) {
        try {
            InputStream is = new BufferedInputStream(new FileInputStream(file));
            AutoDetectParser parser = new AutoDetectParser();
            Detector detector = parser.getDetector();
            Metadata md = new Metadata();
            md.add(Metadata.RESOURCE_NAME_KEY, "test.msg");
            MediaType mediaType = detector.detect(is, md);
            return mediaType.toString();
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }

    private static String urlConnectionGuess(File file) {
        String mimeType = URLConnection.guessContentTypeFromName(file.getName());
        return mimeType;
    }

    private static String fileContentGuess(File file) {
        try {
            InputStream is = new BufferedInputStream(new FileInputStream(file));
            return URLConnection.guessContentTypeFromStream(is);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

und das ist die Ausgabe: 

urlConnectionGuess null
fileContentGuess null
mimeTypesMap.getContentType application/octet-stream
mimeutils application/msword,application/x-hwp
tika application/vnd.ms-Outlook

Aktualisiert Ich habe diese Methode hinzugefügt, um andere Möglichkeiten mit Tika zu testen:

private static void tikaMore(File file) {
    Tika defaultTika = new Tika();
    Tika mimeTika = new Tika(new MimeTypes());
    Tika typeTika = new Tika(new TypeDetector());
    try {
        System.out.println(defaultTika.detect(file));
        System.out.println(mimeTika.detect(file));
        System.out.println(typeTika.detect(file));
    } catch (Exception e) {
        // TODO: handle exception
    }
}

getestet mit einer msg-Datei ohne Erweiterung:

application/vnd.ms-Outlook
application/octet-stream
application/octet-stream

getestet mit einer txt-Datei, die in msg umbenannt wurde:

text/plain
text/plain
application/octet-stream

anscheinend ist der einfachste Weg, den leeren Konstruktor zu verwenden, in diesem Fall der zuverlässigste.

Update Sie können Ihren eigenen Checker mit Apache POI Scratchpad erstellen. Dies ist zum Beispiel eine einfache Implementierung, um den Mime der Nachricht abzurufen, oder null, wenn die Datei nicht das richtige Format hat (normalerweise org.Apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature):

import org.Apache.poi.hsmf.MAPIMessage;

public class PoiMsgMime {

    public String getMessageMime(String fileName) {
        try {
            new MAPIMessage(fileName);
            return "application/vnd.ms-Outlook";
        } catch (Exception e) {
            return null;
        }
    }
}
6
Paizo

Nach einem Kommentar von @ Duffydake versuchte ich, die magischen Zahlen zu lesen. Vereinbart, dass die ersten 8 Bytes des Headers für MS-Dateien gleich bleiben. D0 CF 11 E0 A1 B1 1A E1 (Interessant, die ersten vier Bytes zu sehen, die eDoCFilE ähneln), aber Sie können diesen Link - Header nachvollziehen und den Dateityp. (z. B. im Link findet eine Excel-Datei, aber Sie können den Byte-Dateityp mithilfe ähnlicher Bytes lesen.)

Wenn Sie davon ausgehen können, dass niemand die .doc- oder .xls-Datei als .msg-Datei abspielt und speichert, können Sie einfach die ersten 8 Byte des Headers lesen und die Dateierweiterung verwenden, z. B. if(fileExtension.equals(".msg")&&hexHeaderString.equals('D0 CF 11 E0 A1 B1 1A E1'){mimeType=="application/vnd.ms-Outlook"}.

3
Optional

Sie können versuchen, die Datei in byte[] zu konvertieren und dann MimeMagic ( Maven location hier ) zu verwenden. Sowas in der Art:

byte[] data = FileUtils.toByteArray("file.msg");
MagicMatch match = Magic.getMagicMatch(data);
String mimeType = match.getMimeType();

Ich bin nicht wirklich sicher, dass dies 100% funktionieren wird, aber zu versuchen ist nicht zu sterben :)

2
user

Ich musste eine andere Lösung finden. Was ich fand, war, dass MS-Dokumente (doc, docx, xls, xlsx, msg) komprimierte Dateien mit einer anderen Erweiterung sind. Ich habe nicht jeden MS-Dateityp getestet, da er außerhalb des aktuellen Bereichs liegt

Erweitern Sie einfach die Datei und:

Docx: öffne [Content_Types] .xml und überprüfe, ob es "wordprocessingml" enthält

XlsX: öffne [Content_Types] .xml und überprüfe, ob es "Spreadsheetml" enthält

doc: Auf Datei "WordDocument" prüfen

xls: auf Datei "Arbeitsmappe" prüfen

msg: suche nach Datei "__properties_version1.0"

Ich teste immer noch msg, um zu sehen, ob es etwas Besseres gibt, aber diese Datei existiert in gesendeten und nicht gesendeten Nachrichten. Ich gehe davon aus, dass die Verwendung sicher ist.

0
Atron Seige