如何获取 .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 类型? 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 什么是“补码”?

    我正在学习计算机系统课程并且已经挣扎 部分地 与二进制补码 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