Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何获取.MSG文件的MIME类型?

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

Stack Overflow用户
提问于 2015-06-26 10:57:03
回答 4查看 25K关注 0票数 22

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

代码语言:javascript
运行
AI代码解释
复制
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类型,那么它会以text/plain的形式给出它。

但是我想要的结果是application/vnd.ms-outlook

更新

我还使用了MIME-Util.jar,如下所示……

代码语言:javascript
运行
AI代码解释
复制
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类型呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-29 09:08:02

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

从文件名和内容类型猜测

  1. Java7 Files.probeContentType(path)
  2. URLConnection mime检测
  3. JDK 6 JAF API javax.activation.MimetypesFileTypeMap
  4. MimeUtil使用MimeDetector的所有可用子类我找到
  5. Apache
  6. Apache POI scratchpad<代码>H216<代码>G217

下面是测试类:

代码语言:javascript
运行
AI代码解释
复制
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;
        }
    }

}

这是输出:

代码语言:javascript
运行
AI代码解释
复制
urlConnectionGuess null
fileContentGuess null
mimeTypesMap.getContentType application/octet-stream
mimeutils application/msword,application/x-hwp
tika application/vnd.ms-outlook

更新了Tika我添加了这个方法来测试的其他方式:

代码语言:javascript
运行
AI代码解释
复制
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文件进行测试:

代码语言:javascript
运行
AI代码解释
复制
application/vnd.ms-outlook
application/octet-stream
application/octet-stream

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

代码语言:javascript
运行
AI代码解释
复制
text/plain
text/plain
application/octet-stream

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

更新您可以使用Apache POI scratchpad创建自己的检查器,例如,这是一个简单的实现,用于获取消息的mime,如果文件的格式不正确(通常为org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature),则为null:

代码语言:javascript
运行
AI代码解释
复制
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;
        }
    }
}
票数 9
EN

Stack Overflow用户

发布于 2015-07-05 05:48:41

从@Duffydake的评论中得到了提示,我试着读了这些神奇的数字。同意MS文件头的前8个字节保持不变D0 CF 11 E0 A1 B1 1A E1 (有趣的是看到前四个字节看起来像eDoCFilE),但你可以检查这个link如何理解完整的头和找到文件类型。(例如,在链接中找到一个excel文件,但您可以使用类似的字节读取来查找msg文件类型)

如果你可以假设没有人会把.doc或.xls文件存储为.msg文件,那么你可以只读取头文件的前8个字节,并将其与文件扩展名组合在一起,例如if(fileExtension.equals(".msg")&&hexHeaderString.equals('D0 CF 11 E0 A1 B1 1A E1'){mimeType=="application/vnd.ms-outlook"}

票数 3
EN

Stack Overflow用户

发布于 2015-07-02 13:45:02

您可以尝试将文件转换为byte[],然后使用MimeMagic (Maven location here)来处理它。大概是这样的:

代码语言:javascript
运行
AI代码解释
复制
byte[] data = FileUtils.toByteArray("file.msg");
MagicMatch match = Magic.getMagicMatch(data);
String mimeType = match.getMimeType();

我真的不确定这是否会100%有效,但尝试是不会死的:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31071425

复制
相关文章
MIME类型:从限定选择文件类型看MIME类型 前后端设置
其实,就是给input指定 媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )
周陆军博客
2023/05/07
1.2K0
文件下载-文件MIME类型对照表
MIME 类型 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 MIME列表 扩展名 MIME 1 application/octet-stream 323 text/h323 acx application/internet-property-stream ai application/postscript aif audio/x-aiff aifc a
KenTalk
2018/09/11
3.3K0
常见MIME类型
常见MIME类型 按照功能排列的MIME_type类型 类型/子类型 扩展名 application/envoy evy application/fractals fif application/futuresplash spl application/hta hta application/internet-property-stream acx application/mac-binhex40 hqx application/msword doc application/msword dot app
forrestlin
2022/04/02
1.6K0
MIME 是什么以及对于文件类型
MIME 类型 它是HTTP协议中数据类型 英文全称:Multipurpose Internet Mail Extensions 多用途互联网邮件扩展类型 多功能 Internet 邮件扩充服务。 它与某一种文件的扩展名相对应 常见的MIME类型对应表 MIME类型 文件 超文本标记语言(.html .htm ) text/html 普通文本(.txt) text/plain RTF 文本(.rtf) application/rtf GIF 图形(.gif) image/gif JPEG图形(.jpeg .
用户9006224
2022/12/21
7380
01_常用的MIME类型
.docx   application/vnd.openxmlformats-officedocument.wordprocessingml.document
shirayner
2018/08/10
1.3K0
[PHP] MIME邮件协议的multipart类型
multipart/mixed可以包含附件。 multipart/related可以包含内嵌资源。 multipart/alternative 纯文本与超文本共存
唯一Chat
2019/09/10
3.3K0
tp5 获取文件MIME为application/octet-stream问题
后台管理系统利用excel批量导入用户数据时,其他成员的电脑上上传excel mime-type类application/octet-stream; 无法通过后台验证(后台是校验的mime); 但在我的电脑上可以,百度也没有相关解决方法;
陈大剩博客
2023/03/22
3640
补习系列-springboot mime类型处理
MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展,尽管读起来有些拗口,但大多数人可能都知道, 这是HTTP协议中用来定义文档性质及格式的标准。IETF RFC 6838,对HTTP传输内容类型进行了全面定义。 而 IANA(互联网号码分配机构)是负责管理所有标准MIME类型的官方机构。可以在这里)找到所有的标准MIME
美码师
2018/08/27
2.2K0
如何获取系统下目录的文件系统类型?
这个时候就要介绍下/proc/mounts文件:这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。同时也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。
嵌入式与Linux那些事
2023/03/24
1.4K0
如何获取系统下目录的文件系统类型?
tp5 获取文件MIME为application/octet-stream问题
后台管理系统利用excel批量导入用户数据时,其他成员的电脑上上传excel mime-type类application/octet-stream; 无法通过后台验证(后台是校验的mime); 但在我的电脑上可以,百度也没有相关解决方法;
高久峰
2023/09/18
2960
MIME 类型大全,你值得收藏
【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107746738
后端老鸟
2020/08/02
2.6K0
MIME 类型大全,你值得收藏
Node.js获取文件的文件类型
在使用Node进行文件处理时我们经常会需要不同类型的文件进行不同的处理,并且对客户端进行对应的请求头返回,这里推荐两个个插件进行文件类型的快速获取文件类型。
用户6256742
2022/07/06
8K0
Node.js获取文件的文件类型
什么是docx,pptx等的正确MIME类型?[通俗易懂]
以下是HTTP Content Streaming的正确Microsoft Office MIME类型:
全栈程序员站长
2022/07/11
3.2K0
ASP.NET Core使用静态文件、目录游览与MIME类型管理
前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因为是跨平台的,解耦了IIS,所以这些工作 我们可以在管道代码中处理. 正文 在我们的Web程序开发中,肯定要提供很多的静态文件(比如:JS,CSS)给客户端下载使用.所以我们先来看看ASP.NET Core中是怎么处理的. 当我们创建一个ASP.NET Core MVC的模版程序后,会发现它与传统的文件结构还是
GuZhenYin
2018/03/30
1.9K0
ASP.NET Core使用静态文件、目录游览与MIME类型管理
常见文件MIME对照表
在html的input标签type=file类型时,accept属性可以过滤文件类型。以下是常见文件的MIME对照表
用户2134503
2020/10/28
1.4K0
node.js获取图片文件的真实类型
遇到一个需求:假定有一个图片文件,真实的类型为jpg,而有人偷懒把jpg直接复制一张,存为同名的png文件,这样在as3读取文件时不会遇到问题,但手机c++在读取文件时却遇到问题了 - -!
meteoric
2018/11/16
6.2K0
常见文件的mine type类型及获取方法
前面提到Kangle 服务器添加 mine type 文件类型,但是网上给出的文件类型难免没有那我全面,往往我们正需要的网上却没有。
德顺
2019/11/13
5.5K2
PHP实现的获取文件mimes类型工具类示例
本文实例讲述了PHP实现的获取文件mimes类型工具类。分享给大家供大家参考,具体如下:
用户8660814
2021/07/13
5910
点击加载更多

相似问题

使用文件对象可用于.MSG文件的mime类型

11

如何获取MIME类型的文件?

12

获取文件mime类型

20

获取MIME类型的文件

10

获取文件的mime类型

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档