使用 Tika jar 进行 Mimetype 检查

4 java apache-poi apache-tika

我正在开发标准的 Java 批处理。我正在尝试使用 Tika Jars 确定文件附件 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);
Run Code Online (Sandbox Code Playgroud)

此代码不适用于 office 03 和 07 文档。

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

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

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
Run Code Online (Sandbox Code Playgroud)

我尝试过 OfficePraser、OOXMLParser。它不工作。我尝试过使用 tika 0.9 jar 文件。mimeTypes 是正确的,但如果我的文件附件中的任何一个是“可编辑的 pdf”,我的批处理就会死亡(如代码中的“exit(0);”)。如果我有新的 tika jar,它会给出错误的 mimeTypes。

请帮助我。提前致谢。

CVSR萨尔玛

Gag*_*arr 5

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

TikaConfig tika = new TikaConfig();

Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, filename);
String mimetype = tika.getDetector().detect(stream, metadata);
Run Code Online (Sandbox Code Playgroud)

如果您tika-core的类路径上只有jar,那么上面的检测将使用 Mime Magic 和 Filename 提示。这将让它获得大多数文件,特别是如果它们具有正确的扩展名,但它只会在错误命名的“容器格式”中挣扎

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

请注意,如Javadocs 中所述,您的流需要支持标记和重置才能进行检测。这是为了让 Tika 可以读取您的流的第一位,查看它以确定您的文件是什么,然后将流返回到它准备用于其他用途(例如解析)的状态。大多数流应该的,但如果你没有,最简单的方法解决它是包装在一个TikaInputStream通过TikaInputStream.get,这种种这一切,为你

  • @mjj1409 通常将其包装在`TikaInputStraem` 中更简单,它可以为您处理所有事情![javadocs 详细信息](http://tika.apache.org/1.10/api/org/apache/tika/detect/Detector.html) 标记/重置的流要求,大量流确实支持(包括 TikaInputStream 和缓冲输入流) (2认同)