首页 > 解决方案 > Java io:InputStream 到 zip 文件而不是它的嵌入文件

问题描述

这是我的相关代码片段:

for (Path path : Files.list(Paths.get(this.getClass().getClassLoader().getResource(directoryResource).getPath())).collect(Collectors.toList())) {
    String mediaType = this.tikaService.getMimeType(Files.newInputStream(path));
    assertEquals(Files.probeContentType(path), mediaType);
}

如您所知,this.tikaService.getMimeType(...)收到InputStream我提供的使用Files.newInputStream(path).

一切正常,除非path指向 zip 文件。

在这种情况下,Files.newInputStream()是指向 zip 文件的内容(嵌入文件)而不是指向 zip 文件。

有什么解决办法吗?

编辑

getMimeType代码:

public String getMimeType(InputStream is) {
    TikaConfig tikaConfig = TikaConfig.getDefaultConfig();
    Detector detector = tikaConfig.getDetector(); //new DefaultDetector();
    Metadata metadata = new Metadata();
    MediaType mediaType = detector.detect(TikaInputStream.get(is), metadata);
}

编辑 2 我也尝试ZipContainerDetector使用此配置文件禁用:

<?xml version="1.0" encoding="UTF-8"?>
<properties>
  <detectors>
    <!-- All detectors except built-in container ones -->
    <detector class="org.apache.tika.detect.DefaultDetector">
      <dhttps://stackoverflow.com/posts/52000097/editetector-exclude class="org.apache.tika.parser.pkg.ZipContainerDetector"/>
    </detector>
  </detectors>
</properties>

但结果是一样的。

标签: javajava-io

解决方案


您的 Apache Tika 代码使用DefaultDetector默认情况下可以调用( ZipContainerDetector如果可用)。如果您不想探测 ZIP 文件的内容媒体类型ZipContainerDetector,请从您的配置中删除。

Files.newInputStream()从文件返回输入流,仅此而已。它不会因文件类型或扩展名而有所不同。


推荐阅读