使用 tika 检索错误的 mimetype (application/x-tika-ooxml)

Zah*_*idi 2 java pom.xml apache-tika

对于 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();
    }
Run Code Online (Sandbox Code Playgroud)

还有我的依赖:

<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>
Run Code Online (Sandbox Code Playgroud)

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

小智 6

更新您的 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>
Run Code Online (Sandbox Code Playgroud)

新的微软文档格式(docxxlsx、 ...)只是zip来自外部的档案。较旧的 tika 版本默认情况下不会研究它们,这就是为什么根据版本,它们会将它们检测为application/zipapplication/x-tika-ooxml您可以在此处阅读有关此内容的更多信息。

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

final Metadata metadata = new Metadata();
metadata.add(TikaCoreProperties.RESOURCE_NAME_KEY, fileName);
detector.detect(stream, metadata);
Run Code Online (Sandbox Code Playgroud)

在 HTTP 请求中,文件名也可能位于Content-Disposition 标头中。

  • 但是假设我有一个 docx 文件,如果我将其扩展名更改为 .pdf,它会告诉我我的文件是 PDF 而不是 DOCX,因为它通过他的名字确定了 mimeType,对吧?所以我总是有义务分析档案以确保 Tika 给我正确的 mimeType ?@弗洛里安 (2认同)
  • 我也面临与 Office 文件相同的问题,例如电子表格,其中内容类型始终为“apache/x-tika-ooxml”而不是“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”,因为数据的要确定的内容类型始终作为流获取,没有有关扩展名的信息,我们无法形成具有文件名和扩展名的属性“RESOURCE_NAME_KEY”的元数据对象。我正在使用 tika core 和 tika-parsers-standard-package 两个 2.1.0 版本。你能建议一些解决方案吗? (2认同)