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

2024-01-03

我已经尝试过这些方法来查找文件的 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

UPDATE

我也用过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

UPDATE:

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

那么如何找到MIME类型呢?


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

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

  1. Java 7 Files.probeContentType(path)
  2. URLConnection通过文件名和内容类型猜测进行 MIME 检测
  3. JDK 6 JAF APIjavax.activation.MimetypesFileTypeMap
  4. MimeUtil 及其所有可用子类MimeDetector I found
  5. 阿帕奇蒂卡
  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

Updated我添加此方法是为了测试 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

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

Update您可以使用 Apache POI 暂存器制作自己的检查器,例如,这是一个简单的实现,用于获取消息的 mime 或 null(如果文件格式不正确)(通常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;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 .MSG 文件的 MIME 类型? 的相关文章

随机推荐

  • 什么是“补码”?

    我正在学习计算机系统课程并且已经挣扎 部分地 与二进制补码 http en wikipedia org wiki Two 27s complement 我想理解它 但我读过的所有内容都没有为我提供完整的图片 我读过维基百科文章 http e
  • ElasticSearch 分组并分发到存储桶

    我对 elasticsearch 很陌生 但似乎没有简单的方法来创建聚合并将 doc count 分配到存储桶中 一旦先前的聚合完成 例如 我有以下数据集 我想创建 4 个存储桶和组配置文件 这些配置文件在存储桶之间具有特定数量的事务 配置
  • 图片 - 上传没有响应,无法访问 $_FILES

    这是我的文件上传脚本 我收到以下错误 Notice Undefined index fupload in C Users Tuskar Desktop Projekt htdocs Project IT Space Profile edit
  • 原生安装 PySpark 也支持 S3 访问

    我想从 PySpark 读取存储在 S3 上的 Parquet 数据 我从这里下载了 Spark http www apache org dist spark spark 2 1 0 spark 2 1 0 bin hadoop2 7 tg
  • 在 Android 中完成(或访问)特定 Activity

    当用户打开 Activity 时 它们会堆积在视图堆栈上 当用户以任何方式完成一个 Activity 时 它就会从视图堆栈中弹出 现在 我遇到一种情况 用户打开了应用程序的主屏幕 并在主屏幕顶部连续打开了多个活动 在每个活动中 都有一个控件
  • 如何向 OSX launchd plist 添加参数以将输出通过管道传输到日志文件?

    我已经尝试了许多不同的变体 但就是无法让它发挥作用 我有一个 plist 文件
  • 在Python中从csv创建kml

    我是Python新手 我正在处理 GPS 文件 我需要将包含所有 GPS 数据的 CSV 文件转换为 kml 文件 下面是我正在使用的 python 代码 import csv Input the file name fname raw i
  • 使用 CUDA 感知 MPI 的要求

    我想通过 CUDA 感知 MPI 在不同 CUDA 设备之间交换数据 如中所述本文 http devblogs nvidia com parallelforall introduction cuda aware mpi 据我了解 以下代码应
  • 一次删除 40k+ 行的更快方法

    有没有更快的方法来删除行 我只需要删除从第 3 行到最后一行有数据的奇数行 下面的代码可以工作 但速度很慢 Dim toDelete As Range For icount endRow To 3 Step 2 If toDelete Is
  • 如何在 Python 中解析文件列表以仅获取文件名?

    假设我正在使用 Pythonftplib http www python org doc 2 5 2 lib module ftplib html从 FTP 服务器检索日志文件列表 我将如何解析该文件列表以仅获取列表中的文件名 最后一列 请
  • 从 Flutter 请求 ASP.Net Core 3.0 的错误请求 400

    我正在尝试连接 Flutter 的 HttpClient 以从在 ASP Net Core 3 0 上运行的本地服务器获取数据 问题是我每次尝试时都会收到错误 400 错误请求 这是颤振代码 String token await Share
  • 在 JSFiddle 中加载 Facebook API

    我希望能够在 JSFiddle 中加载 Facebook API 这是我的目前的尝试 https jsfiddle net casebash j26bq6qf 11 当我跑步时 window fbAsyncInit function FB
  • 验证查询中的所有位置是否都进行了特定的联接

    我必须以存储过程的形式执行数百个查询 并验证每个连接是否满足以下条件 始终在连接中进行特定的列连接 连接不以硬编码格式存在于该列的前一个唯一值 即它需要类似于 a requiredJoinColumn b requiredJoinColum
  • 如何防止JTable按Tab时返回第一行?

    当在表的最后一个单元格中按 Tab 键时 如何禁用 JTable 返回第一行的默认行为 相反 当前单元格应该保持其焦点 简短的答案 找到绑定到选项卡的操作 将其包装到自定义操作中 仅当不在最后一个单元格中时才委托给原始操作 并将原始操作替换
  • CalendarView 需要花费很多时间来显示

    我正在开发 CalendarView 上的应用程序 我必须以小的线性布局显示calendarView 显示包含小线性布局中的 calendarView 的整个页面时会出现问题 gt 这需要 10 秒才能显示 而且时间太长了 布局中没有其他东
  • 在 C# 中从文本文件读取随机行到文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发这个程序 它的功能之一是有一个部分 程序自动从文本文件中随机选择一行 它包含的内容并不重要 并将其显示在文本框中 我花了很多
  • Echonest API 迁移问题

    我当前使用 Echonest API 在 ID 空间之间进行转换 MusicBrainz gt SeatGeek 随着 Spotify API 即将迁移 我想知道 Project Rosetta 是否会有任何端点 这是我的应用程序的一个非常
  • 如何使用 sweet Alert 2 执行 Rails 命令?

    我有以下内容sweet alert 2信息
  • SQL Server 2005 排序规则问题

    我有两个表 它们使用不同的排序规则 不允许连接具有不同排序规则的表中的列 例如不允许使用以下 SQL select table1column1 table2column2 from 我的问题是 如何在不破坏表数据的情况下更改表的排序规则 提
  • 如何获取 .MSG 文件的 MIME 类型?

    我已经尝试过这些方法来查找文件的 MIME 类型 Path source Paths get C Users akash Desktop FW Internal release of MSTClient Server5 02 04 24 m