使用 tika (application/x-tika-ooxml) 检索错误的 mime 类型

Posted

技术标签:

【中文标题】使用 tika (application/x-tika-ooxml) 检索错误的 mime 类型【英文标题】:Retrive bad mimetype with tika (application/x-tika-ooxml) 【发布时间】:2022-01-06 13:20:16 【问题描述】:

使用 docx 文件,我检索 application/x-tika-ooxml,但我应该检索 application/vnd.openxmlformats-officedocument.wordprocessingml.document

这是我的方法:

public String retrieveMimeType(InputStream stream) throws IOException, TikaException 
        TikaInputStream tikaStream = null;
        TikaConfig tikaConfig = new TikaConfig();
        MediaType mediaType = null;

        try 
            mediaType = tikaConfig.getDetector().detect(TikaInputStream.get(stream), new Metadata());
         catch (Throwable t) 
            throw t;
         finally 
            if (tikaStream != null) 
                try 
                    tikaStream.close(); 
                 catch (IOException e) 
                
            
        
        return mediaType.toString();
    

还有我的依赖:

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.27</version>
</dependency>

我使用 tika-core 和 tika-parsers 来检索正确的 mimetype,但它仍然给我错误的 mimetype...

【问题讨论】:

【参考方案1】:

更新您的 tika 模块。 tika-core 的版本和它的模块应该总是一样的。

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.1.0</version>
</dependency>

新的 Microsoft 文档格式(docxxlsx、...)只是外部的 zip 存档。默认情况下,较旧的 tika 版本不会查看它们,这就是为什么根据版本,它们会将它们检测为 application/zipapplication/x-tika-ooxml。你可以阅读更多关于这个here的信息。

分析档案但可能会导致性能下降。为防止这种情况,您可以根据您的用例,按名称确定 mime 类型(见下文)或使用现有的 mime 类型,如 Content-Type header。

final Metadata metadata = new Metadata();
metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, fileName);
detector.detect(stream, metadata);

在 HTTP 请求中,文件名也可能在 Content-Disposition header 中。

【讨论】:

但是假设我有一个 docx 文件,如果我将他的扩展名更改为 .pdf,它会告诉我我的文件是 PDF 而不是 DOCX,因为它通过他的名字确定 mimeType正确的 ?所以我总是有义务分析档案以确保 Tika 给我正确的 mimeType ? @弗洛里安 如果你想确定类型,你需要给 Apache Tika 整个文件来检测。如果您提供名称 + 内容,则名称仅用于特化子类型,它不会覆盖基于内容的检测 我也面临与办公文件相同的问题,例如内容类型始终为“apache/x-tika-ooxml”而不是“application/vnd.openxmlformats-officedocument.spreadsheetml”的电子表格。 sheet”,因为要确定内容类型的数据总是作为流获得,没有关于扩展名的信息,我们无法形成具有文件名和扩展名属性“RESOURCE_NAME_KEY”的元数据对象。我正在使用 tika core 和 tika-parsers-standard-package 两个 2.1.0 版本。你能提出一些解决方案吗?

以上是关于使用 tika (application/x-tika-ooxml) 检索错误的 mime 类型的主要内容,如果未能解决你的问题,请参考以下文章

tika的使用

TIKA Server 提取嵌入式资源

正确使用 Apache Tika MediaType

使用 Apache tika 获取 MimeType 子类型

Tika 检测多部分/签名

REPL 和 jar 中的 Tika Parser 行为不同