gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:38:16 25 4
gpt4 key购买 nike

对于 odt、ppt、pptx、xlsx 等文档,我需要获取 iana.org MediaType 而不是 application/zip 或 application/x-tika-msoffice。

如果您查看 mimetypes.xml,就会发现 mimeType 元素由 iana.org mime-type 和“sub-class-of”组成

   <mime-type type="application/msword">
<alias type="application/vnd.ms-word"/>
............................
<glob pattern="*.doc"/>
<glob pattern="*.dot"/>
<sub-class-of type="application/x-tika-msoffice"/>
</mime-type>

如何获取 iana.org mime 类型名称而不是父类型名称?

在测试 MIME 类型检测时,我这样做:

MediaType mediaType = MediaType.parse(tika.detect(inputStream));
String mimeType = mediaType.getSubtype();

测试结果:

FAILED: getsCorrectContentType("application/vnd.ms-excel", docs/xls/en.xls)
java.lang.AssertionError: expected:<application/vnd.ms-excel> but was:<x-tika-msoffice>

FAILED: getsCorrectContentType("vnd.openxmlformats-officedocument.spreadsheetml.sheet", docs/xlsx/en.xlsx)
java.lang.AssertionError: expected:<vnd.openxmlformats-officedocument.spreadsheetml.sheet> but was:<zip>

FAILED: getsCorrectContentType("application/msword", doc/en.doc)
java.lang.AssertionError: expected:<application/msword> but was:<x-tika-msoffice>

FAILED: getsCorrectContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document", docs/docx/en.docx)
java.lang.AssertionError: expected:<application/vnd.openxmlformats-officedocument.wordprocessingml.document> but was:<zip>

FAILED: getsCorrectContentType("vnd.ms-powerpoint", docs/ppt/en.ppt)
java.lang.AssertionError: expected:<vnd.ms-powerpoint> but was:<x-tika-msoffice>

有没有办法从 mimetypes.xml 中获取实际的子类型?而不是 x-tika-msoffice 或 application/zip ?

此外,我从来没有得到 application/x-tika-ooxml,但得到了 xlsx、docx、pptx 文档的 application/zip。

最佳答案

最初,Tika 仅支持通过 Mime Magic 或文件扩展名 (glob) 进行检测,因为这是 Tika 之前的大多数 mime 检测。

由于 Mime Magic 和 globs 在检测容器格式方面存在问题,因此决定向 Tika 添加一些新的检测器来处理这些问题。 Container Aware Detectors 获取整个文件,打开并处理容器,然后根据内容计算出确切的文件类型。最初,您需要显式调用它们,但随后它们被包裹在 ContainerAwareDetector 中,您将在一些答案中看到它。

从那时起,Tika 添加了服务加载器模式,最初是针对解析器的。这允许类在存在时自动加载,并使用一种通用方法来识别哪些是合适的并使用它们。这种支持随后也扩展到检测器,此时可以删除旧的 ContainerAwareDetector 以支持更清洁的东西。

如果您使用的是 Tika 1.2 或更高版本,并且您希望准确检测所有格式,包括容器格式,您需要执行以下操作:

 TikaConfig config = TikaConfig.getDefaultConfig();
Detector detector = config.getDetector();

TikaInputStream stream = TikaInputStream.get(fileOrStream);

Metadata metadata = new Metadata();
metadata.add(Metadata.RESOURCE_NAME_KEY, filenameWithExtension);
MediaType mediaType = detector.detect(stream, metadata);

如果您只使用 Core Tika jar (tika-core-1.2-....) 运行它,那么唯一存在的检测器将是 mime magics 检测器,您将获得基于 magic 的旧式检测+ 只有全局。但是,如果您同时使用 Core 和 Parser Tika jar(加上它们的依赖项)或从 Tika App(自动包含核心 + 解析器 + 依赖项)运行它,则 DefaultDetector 将使用所有各种不同的容器检测器来处理您的文件.如果您的文件是基于 zip 的,则检测将包括处理 zip 结构以根据其中的内容识别文件类型。这将为您提供您所追求的高精度检测,而无需依次调用许多不同的解析器。 DefaultDetector 将使用所有可用的检测器。

关于java - 使用 Apache tika 获取 MimeType 子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com