Tika将docx文件检测为Zip

时间:2016-08-23 16:31:01

标签: java apache-tika

我有以下测试代码来检测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);
    }

,而getServerInducedType实现如下:

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”。为什么?

PS。我没有任何tika.config或TIKA_CONFIG env变量(参见here)。

我还在pom文件中添加了tika解析器和tika核心(参见here

这是我得到的输出:

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

我用jpg文件测试它,Tika可以很好地检测到它像image / jpeg

我的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>

2 个答案:

答案 0 :(得分:1)

我正在将我的评论转换为答案,因为OP要求它,即使它部分回答问题。

.docx个文档是包含具有固定体系结构的xml文件的实际.zip个档案。

用7zip打开docx你会看到:

enter image description here

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

如果您发现它,您可以放心地认为它是docx文档。

它当然不是单个xml文件,而是.zip中的xml文件集合

Microsoft按文件here

描述内容文件

open office xml文档似乎只是一个XML文件而不是一个存档。这就是为什么我没有看到微软如何符合开放式办公标准的原因。打败我。

但至于“如何检测docx”的问题,我的答案允许这样做。您“只需”添加额外的代码来打开zip文件并检查特殊的文件/目录名称。

答案 1 :(得分:-2)

docx是一个zip,将扩展名更改为.zip并打开它以说服自己。

可能希望指向。

中的实际ooxml文件