我有以下测试代码来检测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>
答案 0 :(得分:1)
我正在将我的评论转换为答案,因为OP要求它,即使它部分回答问题。
.docx
个文档是包含具有固定体系结构的xml文件的实际.zip
个档案。
用7zip打开docx你会看到:
如果程序只是分析了zip标题,它会检测到标准zip。
如果发生这种情况,只需扫描zip标题并查找[ContentTypes].xml
。
如果您发现它,您可以放心地认为它是docx文档。
它当然不是单个xml文件,而是.zip中的xml文件集合
Microsoft按文件here
描述内容文件open office xml文档似乎只是一个XML文件而不是一个存档。这就是为什么我没有看到微软如何符合开放式办公标准的原因。打败我。
但至于“如何检测docx”的问题,我的答案允许这样做。您“只需”添加额外的代码来打开zip文件并检查特殊的文件/目录名称。
答案 1 :(得分:-2)
docx是一个zip,将扩展名更改为.zip并打开它以说服自己。
可能希望指向。
中的实际ooxml文件