当前位置: 首页 > 知识库问答 >
问题:

Tika检测到docx文件为Zip

松骏俊
2023-03-14

我有以下测试代码来检测docx内容类型:

@Test
    public void testContentTypeOfaWordDOCXFileIsReturnedCorrectlyByTheServer() throws IOException, TikaException {
        File docxFile = new File(FILE_COMPLETE_PATH);
        InputStream inputStream = new FileInputStream(docxFile);
        MediaType mediaType=spyServlet.getServerInducedType(inputStream);

        assertEquals(DOCX_TYPE, mediaType);
    }

而GetServerIntradedType的实现方式如下:

protected MediaType getServerInducedType(InputStream inputStream) throws IOException, TikaException {
        try (BufferedInputStream buffStream = new BufferedInputStream(inputStream);
             TikaInputStream tikaInputStream = TikaInputStream.get(buffStream)
        ) {
            TikaConfig tikaConfig = new TikaConfig();
            Detector detector = tikaConfig.getDetector();
            Metadata metadata=new Metadata();
            MediaType mediaType=detector.detect(tikaInputStream, metadata);
            return mediaType;
        }
    }

问题:当我运行上面的测试时,我希望得到DOCX_TYPE,即“application/x-tika-ooxml”,但我得到的是“application/zip”。为什么?

java.lang.AssertionError:  Expected :application/x-tika-ooxml Actual   :application/zip  <Click to see difference>

我的pom文件具有以下配置:

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

共有1个答案

韦寒
2023-03-14

用7zip打开一个docx,您会看到:

如果程序只分析zip头,它检测到一个标准zip。如果发生这种情况,只需扫描zip头并查找[ContentTypes].xml

如果找到它,您可以放心地假设它是一个docx文档。

 类似资料:
  • 如何使用apache tika来检测文件是否是MP3?我不只是寻找基于文件扩展名的检测。 这个问题不是重复的。这里有人使用Tika与文件扩展名检测。这对我来说还不够。我需要知道是否文件是mp3或不是基于文件类型,而不是文件名。我在文档中找不到如何做到这一点的任何信息。 TypeDetector总是为所有文件类型返回Application/Octet流,所以我想知道如何使用它来获取信息,如果文件是m

  • 我试图从docx中提取文本:tika-app做得很好,但当我试图在代码中做同样的事情时,结果是什么也没有,tika解析器说我的docx文件的内容类型是“application/zip”。 我该怎么办?我应该使用递归方法(像这样)还是有其他方法? java.lang.noClassDefFounderRor:org/apache/poi/openXML4j/exceptions/invalidFor

  • 我使用spring JAX-RS将文件作为多部分表单数据上传。我有inputstream对象作为参数。当我将这个输入流复制到磁盘时,我得到了我的文本文件。 但是当我试图检测这个输入流的内容类型时,我得到的内容类型是application/octet-stream。 作为一个测试,我还用tika desktop测试了相同的文件,并获得了正确的内容类型。

  • 我之前通过调用成功地用Tika解析了所有类型的文件,而没有设置任何自定义配置或元数据。现在我需要根据MIME-Type过滤文件进行解析。 我可以用找到mime-type,但是在调用之后,tika使用EmptyParser,检测到的内容类型是“application/octet-stream”。这是默认值,意味着tika无法找到它是什么类型的文件。我试图在解析文件之前设置元数据中的内容类型,但这导致

  • 我一直试图仅使用文件内容检测MIME类型,使用Apache Tika Core和Apache Tika Parser1.23 jars。下面是用于相同内容的代码: Tika无法检测扩展名为。tmp(text/plain file)和iso-8859-1字符集的文件的内容类型,内容如下: èé 通过以下方式正确检测具有相同配置和以下内容的文件: 000000000000000000000000000

  • 使用我想检测的tika。属性文件为属性文件(文本/属性)基于属性文件中的键和值格式,其他为文本文件(文本/普通) 上面我写了一个自定义类,它实现了tika的Detector接口,还为mime类型创建了一个自定义文件: 将上述自定义类与META-INF/services/org一起添加到jar文件中。阿帕奇。蒂卡。发现探测器文件,但当我运行程序时,它会打印一个文件为文本/普通,但不是文本/属性文件