为什么带有 get .mp4 文件的 Apache tika 以 "video/quicktime" 的内容类型响应?



我使用此功能获取文件contentType,当使用.jpg文件接收" Image/jpg"时。使用.mp4接收"视频/QuickTime"

public static String detectMediaType(String fileName,byte[] data) {
    ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, fileName);
    try{
        MediaType mediaType = detector.detect(inputStream, md);
        return mediaType.toString();
    }catch (IOException ex){
        throw new RuntimeException("Failed to detect mediaType for file: " + fileName,ex);
    }
}

这是可以预期的,因为您使用的是TIKA检测器功能,该功能对于MP4或其他QuickTime格式返回通用的'视频/QuickTime'。如果需要获得"视频/MP4"之类的精确类型,则应使用Tika Parser,例如:

if (mediaType.equals(MediaType.video("quicktime"))) {
    Parser parser = new AutoDetectParser();
    ContentHandler handler = new BodyContentHandler();
    Metadata metadata = new Metadata();
    ParseContext context = new ParseContext();
    parser.parse(inputStream, handler, metadata, context);
}

我使用tikas defaultDetector也有相同的问题。

解决方案,如下所示:https://tika.apache.org/2.3.0/detection.html(在"容器"识别检测"下),是使用TikaInputStream,而不是标准的InputStream。P>

detector.detect(TikaInputStream.get(inputStream), metadata);

  • 不要忘记关闭流。
  • 还确保tika-parsers-* JAR在类路径中。

我有同样的问题,并且想知道,为什么我仍然得到" video/quicktime"在使用上面的答案后,作为模拟型。因此,要结论一切:

  • 使用解析器检测元数据(如第一个答案中)

  • 使用tikainputstream(如第二个答案中),但是 not 尝试重复使用

  • 在您的依赖项中包括一个特定的解析器(在这种情况下,是 org.apache.tika.tika.mp4.mp4.mp4parser

     Tika tika = new Tika();
     String detectedType;
     try (
       TikaInputStream parserInputStream = TikaInputStream.get(new ByteArrayInputStream(bytes));
       TikaInputStream detectionInputStream = TikaInputStream.get(new ByteArrayInputStream(bytes));
     ) {
       // reading metadata from file, important for video type detection (quicktime, mp4, ...)
       Parser parser = new AutoDetectParser();
       BodyContentHandler handler = new BodyContentHandler();
       Metadata metadata = new Metadata();
       ParseContext context = new ParseContext();
       parser.parse(parserInputStream, handler, metadata, context);
       // read the type
       // would like to reuse the stream from above (used by parser), but this can end in a wrong mimetype
       // parserInputStream.reset();
       detectedType = tika.detect(detectionInputStream, metadata);
     } catch (Exception ex) {
       detectedType = tika.detect(bytes);
       log.warn("Could not read MimeType of file '{}' using Metadata, using fallback detection: '{}'", file.getOriginalFilename(), detectedType);
     }
    

依赖项,例如在Maven中:

<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-core</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-parser-audiovideo-module</artifactId>
  <scope>runtime</scope>
</dependency>

最新更新