Java 使用Tika罐进行模拟类型检查

Java 使用Tika罐进行模拟类型检查,java,apache-poi,apache-tika,Java,Apache Poi,Apache Tika,我正在开发标准的Java批处理过程。我正在尝试使用Tika JAR确定文件附件mimetype。我使用的是Tika 1.4 Jar文件 我的代码看起来像 Parser parser= new AutoDetectParser(); InputStream stream = new FileInputStream(fileAttachment); int writerHandler =-1; ContentHandler contentHandler= new BodyContentHandler

我正在开发标准的Java批处理过程。我正在尝试使用Tika JAR确定文件附件mimetype。我使用的是Tika 1.4 Jar文件

我的代码看起来像

Parser parser= new AutoDetectParser();
InputStream stream = new FileInputStream(fileAttachment);
int writerHandler =-1;
ContentHandler contentHandler= new BodyContentHandler(writerHandler);
Metadata metadata= new Metadata();
parser.parse(stream, contentHandler, metadata, new ParseContext());
String mimeType = metadata.get(Metadata.CONTENT_TYPE);
logger.debug("File Attachment: "+fileattachment.getName()+" MimeType is: "+mimeType);
对于office 03和07文档,此代码无法正常工作

从eclipse运行时,我得到了正确的mimetype。

我构建jar文件并从命令运行,它给出了错误的mimetype。

out put from command
------------
File Attachment: Testpdf.pdf  MimeType is: application/pdf
File Attachment: Testpdf.tif  MimeType is: image/tiff
File Attachment: Testpdf.xlsx  MimeType is: application/x-tika-ooxml
File Attachment: Testpdf.xltx  MimeType is: application/x-tika-ooxml
File Attachment: Testpdf.pptx  MimeType is: application/x-tika-ooxml
File Attachment: Testpdf.docx  MimeType is: application/x-tika-ooxml
File Attachment: Testpdf.xls  MimeType is: application/zip
File Attachment: Testpdf.doc  MimeType is: application/x-tika-msoffice
File Attachment: Testpdf.dot  MimeType is: application/x-tika-msoffice
File Attachment: Testpdf.ppt  MimeType is: application/x-tika-msoffice
File Attachment: Testpdf.xlt  MimeType is: application/vnd.ms-excel
我试过使用OfficeParser,OOXMLParser。它不起作用。 我试过使用tika 0.9 jar文件。mimeTypes正确,但是如果我的任何一个文件附件是“可编辑的pdf”,我的批处理过程将停止(比如代码中的“exit(0);”。 如果我有新的提卡罐,它会给出错误的模版

请帮我做这件事。提前谢谢


CVSR Sarma

首先,您使用了错误的Apache Tika。如果您只想知道文件类型,那么应该直接使用(),例如:

TikaConfig tika = new TikaConfig();

Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, filename);
String mimetype = tika.getDetector().detect(stream, metadata);
如果您的类路径上只有
tika-core
jar,那么上面的检测将使用Mime-Magic和文件名提示。这将使它获得大多数文件,特别是如果它们具有正确的扩展名,但它只会遇到命名错误的“容器格式”的问题

容器格式类似于zip、ole2等,其中一种文件格式可以容纳多种类型(例如ods、xlsx、keynote all use.zip、.doc和.xls都使用ole2)。如果要在容器内进行检测以获得更准确的结果,还需要包含
tika解析器
jar及其依赖项


请注意,您的流需要支持标记和重置,以便检测工作。这样Tika就可以读取流的第一位,查看它以确定文件是什么,然后将流返回到其他用途(例如解析)的状态。大多数流都应该这样做,但如果您的流没有这样做,最简单的修复方法是将其封装在一个via中,这样可以为您排序所有这些

@Gagravarr tika.getDetector().detect(流、元数据);返回Mediatype。我试过了。它不起作用。请确保如图所示传入文件名,如果希望得到正确准确的结果,请确保在类路径中包含了tika解析器jar+依赖项,正如答案所示……它在Eclipse中起作用。一旦我构建jar文件并从命令提示符运行,它就不起作用了。我已经使用maven下载了jar和依赖项,并在类路径中包含了所有jar文件@gagravarr如果它在Eclipse中工作,但在独立运行时不工作,那么问题是无论您怎么想,您的类路径上都没有相同的JAR。确保它们真的在那里,并且你没有任何旧的会让事情变得混乱。如果你不知道如何检查你的手机上到底用了什么罐子,那就问一个新问题classpath@mjj1409通常更简单的方法是将其包装在
TikaInputStraem
中,它可以为您处理所有事情!标记/重置的流要求,很多流都支持这一点(包括TikaInputStream和BufferedInputStream)