java - 如何获取 .MSG 文件的 MIME 类型?

标签 java mime-types msg

我已经尝试过这些方法来查找文件的 MIME 类型...

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

以上代码返回null...
如果我使用 Apache 的 TIKA API 来获取 MIME 类型,那么它将以文本/纯文本形式提供...

但我希望结果为 application/vnd.ms-outlook

更新

我还使用了 MIME-Util.jar 如下代码...

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

这给了我 application/msword

的输出

更新:

Tika API 超出范围,因为它太大而无法包含在项目中...

那么我怎样才能找到 MIME 类型呢?

最佳答案

我尝试了一些可能的方法,使用 tika 得到了您预期的结果,我没有看到您使用的代码,所以我无法仔细检查。

我尝试了不同的方法,不是全部在代码片段中:

  1. Java 7 Files.probeContentType(路径)
  2. URLConnection 从文件名和内容类型猜测中检测 mime
  3. JDK 6 JAF API javax.activation.MimetypesFileTypeMap
  4. MimeUtil 以及我找到的所有可用的 MimeDetector 子类
  5. Apache 蒂卡
  6. Apache POI 暂存器

这里是测试类:

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

}

这是输出:

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

更新我添加了这个方法来测试 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
    }
}

使用没有扩展名的 msg 文件进行测试:

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

使用重命名为 msg 的 txt 文件进行测试:

text/plain
text/plain
application/octet-stream

似乎在这种情况下使用空构造函数最简单的方法是最可靠的。

更新您可以使用 Apache POI 暂存器制作自己的检查器,例如,这是一个简单的实现来获取消息的 mime,如果文件格式不正确则返回 null(通常 org.apache.poi.poifs.filesystem.NotOLE2FileException:无效的 header 签名):

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

关于java - 如何获取 .MSG 文件的 MIME 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31071425/

相关文章:

java - 编码对 JSON 重要吗?

java - 正则表达式奇数/偶数

php - 不允许 CodeIgniter 上传类 PDF 文件类型

java - 将 EML 转换为 MSG - Java

java - 使用 Assets 文件夹(本地)进行简单的json解析

java - 我们如何处理 LDAP 过滤器中的换行?

java - 使用 Apache tika 获取 MimeType 子类型

php - Internet Explorer 文件上传未通过 MIME 类型检查

QNX 消息接收脉冲

java - 从 *.msg 文件接收电子邮件地址而不是带有 POI 的姓名 [Java]