Apache Tika 检测返回不一致的结果

问题描述 投票:0回答:2

我正在尝试使用 apache tika 找出文件的内容类型。

同时我发现这种不一致的行为。

final Tika tika = new Tika();

String fileType = tika.detect(uploadedInputStream);
System.out.println(fileType);
String newFileType = tika.detect(uploadedInputStream);
System.out.println(newFileType);

上面的代码给我输出为

application/pdf
application/octet-stream

我期望两种情况下的输出都是

application/pdf

谁能解释一下为什么会这样?我怎样才能得到预期的结果?

java file-type apache-tika
2个回答
2
投票

当我按照评论中的建议将InputStream包装在TikaInputStream中时,我可以看到问题已经解决了

    final Tika tika = new Tika();
    TikaInputStream tikaInputStream = TikaInputStream.get(uploadedInputStream);
    String fileType = tika.detect(tikaInputStream);
    System.out.println(fileType);
    final Tika newTika = new Tika();
    String newFileType = newTika.detect(tikaInputStream);
    System.out.println(newFileType);

输出:

     application/pdf
     application/pdf

0
投票

当您尝试使用 tika 检测内容类型时,它会消耗您的整个输入流,并且一次后它将为空。因此,当您第二次尝试提供相同的输入流时,您将看到 application/octet-stream (未知的二进制文件),因为您的流是空的。

Tika tika = new Tika();
// preserve your stream as an instance and reuse it
TikaInputStream tikaInputStream = TikaInputStream.get(inputStream);
String fileType = tika.detect(tikaInputStream);
System.out.println(fileType);
final Tika newTika = new Tika();
String newFileType = newTika.detect(tikaInputStream);
System.out.println(newFileType);

您还可以复制源输入流以保留它。

© www.soinside.com 2019 - 2024. All rights reserved.