web-dev-qa-db-fra.com

Comment obtenir le type MIME d'un fichier .MSG?

J'ai essayé ces façons de trouver le type MIME d'un fichier ...

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

Le code ci-dessus renvoie null...
Et si j’utilise l’API TIKA d’Apache pour obtenir le type MIME, il le donne sous forme de texte/texte ...

Mais je veux le résultat en tant que application/vnd.ms-Outlook

METTRE À JOUR

J'ai aussi utilisé MIME-Util.jar comme suit avec le code ...

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();

Cela me donne une sortie en tant que application/msword

METTRE À JOUR:

L'API de Tika est hors de portée car elle est trop grande pour être incluse dans le projet ...

Alors, comment puis-je trouver le type MIME?

19
CoderNeji

J'ai essayé certaines des méthodes possibles et utiliser tika donne le résultat escompté. Je ne vois pas le code que vous avez utilisé, je ne peux donc pas le vérifier.

J'ai essayé différentes méthodes, pas toutes dans l'extrait de code:

  1. Java 7 Files.probeContentType(path)
  2. URLConnection détection mime à partir du nom de fichier et du type de contenu 
  3. API JAF JDK 6 javax.activation.MimetypesFileTypeMap
  4. MimeUtil avec toutes les sous-classes disponibles de MimeDetector j'ai trouvé
  5. Apache Tika
  6. Bloc-notes Apache POI

Voici la classe de test:

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;
        }
    }

}

et voici la sortie: 

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

Mise à jour J'ai ajouté cette méthode pour tester d'autres méthodes avec Tika:

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
    }
}

testé avec un fichier msg sans extension:

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

testé avec un fichier txt renommé en msg:

text/plain
text/plain
application/octet-stream

semble que le moyen le plus simple en utilisant le constructeur vide est le plus fiable dans ce cas.

Mise à jour vous pouvez créer votre propre vérificateur à l’aide du bloc-notes Apache POI. Par exemple, il s’agit d’une implémentation simple permettant d’obtenir le mime du message ou la valeur null si le fichier n’est pas au format correct (généralement 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

Ce que vous pouvez faire est d’essayer de convertir le fichier en byte[] puis d’utiliser MimeMagic ( emplacement Maven ici ) pour le gérer. Quelque chose comme ca:

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

Je ne suis pas vraiment sûr que cela fonctionnera à 100%, mais essayer, c'est ne pas mourir :)

2
user

Je devais obtenir une autre solution de contournement. Ce que j'ai trouvé, c'est que les documents MS (doc, docx, xls, xlsx, msg) sont des fichiers compressés avec une extension différente. Je n'ai pas testé tous les types de fichiers MS car ils ne sont pas concernés

Développez simplement le fichier et:

Docx: ouvrez le fichier [Content_Types] .xml et vérifiez s'il contient "wordprocessingml"

XlsX: ouvrez [Content_Types] .xml et vérifiez s'il contient "tableur"

doc: vérifier le fichier "WordDocument"

xls: vérifier le fichier "classeur"

msg: vérifier le fichier "__properties_version1.0" 

Je teste toujours msg pour voir s'il y a quelque chose de mieux à utiliser, mais ce fichier existe en messages envoyés et non envoyés, donc je suppose il est sans danger. 

0
Atron Seige