我正在开发单独的标准Java批处理过程。我正在尝试使用TikaJars来确定文件附件的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
我尝试了OfficePraser,OOXMLParser。它不起作用。我试过tika 0.9 jar文件。mimeTypes是正确的,但如果我的任何一个文件附件是"可编辑的pdf",我的批处理过程就会终止(比如代码中的"exit(0);")。如果我有新的提卡罐,它会给出错误的mimeTypes。
请帮我一下。提前谢谢。
CVSR Sarma
首先,您使用了错误的Apache Tika。如果您只想知道文件类型,那么您应该直接使用Detection API(javadocs),例如:
TikaConfig tika = new TikaConfig();
Metadata metadata = new Metadata();
metadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, filename);
String mimetype = tika.getDetector().detect(stream, metadata);
如果类路径上只有tika-core
jar,那么上面的检测将使用Mime Magic和Filename提示。这将使它获得大多数文件,特别是如果它们有正确的扩展名,但它只会遇到名称错误的问题;容器格式";
容器格式是zip、ole2等,其中一个文件格式可以容纳多种类型(例如ods、xlsx、keynote都使用.zip、.doc和.xls都使用ole2)。如果您想在容器内部进行检测以获得更准确的结果,还需要包括tika-parsers-standard
jar及其依赖项。
请注意,正如Javadocs中所解释的,您的流需要支持标记和重置才能进行检测。这样Tika就可以读取流的第一位,查看它以确定文件是什么,然后将流返回到它可以用于其他用途的状态(例如解析)。大多数流都应该,但如果你的流没有,最简单的修复方法是通过TikaInputStream.get将其封装在TikaInputStream中,它会为你整理