我正在使用Tika-server解析一堆eml文件。在使用/rmeta端点时,提取eml和附件的内容和元数据很好。
正确的附件文件名出现问题。当原始eml文件中的附件部分具有以下结构时:
Content-Type: application/pdf; name="filename_a.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="filename_a.pdf"所有操作都很好:元数据对象中提取的文件名路径(在api响应中)是:
"X-TIKA:embedded_resource_path": "/filename_a.pdf"然而,我的一些电子邮件有格式错误的标题结构(在内容处理中缺少文件名),即:
Content-Type: application/pdf; name="filename_a.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;然后,在解析完整个eml之后,我得到:
"X-TIKA:embedded_resource_path": "/embedded-1"我在Tika的源代码中检查了文件名meta是在\org\apache\tika\parser\RecursiveParserWrapper.class中定义的:
private String getResourceName(Metadata metadata, RecursiveParserWrapper.ParserState state) {
String objectName = "";
if (metadata.get("resourceName") != null) {
objectName = metadata.get("resourceName");
} else if (metadata.get("embeddedRelationshipId") != null) {
objectName = metadata.get("embeddedRelationshipId");
} else {
objectName = "embedded-" + ++state.unknownCount;
}
objectName = FilenameUtils.getName(objectName);
return objectName;
}我试图通过检查元数据对象中的Content键来访问提到的文件名属性,但它并不存在。(我假设Tika评估内容类型键,而不仅仅是通过查找适当的标题,因此不需要文件名)
因此,我的问题(因为我无法弄清楚)是否有一种方法来修改Tika源代码,在内容处理标题中缺少适当的文件名属性时,强制从内容类型标头中提取文件名?
发布于 2019-11-27 13:56:45
好吧,所以我自己解决了。解决办法是简单明了的。
必须扩展\org\apache\tika\parser\mail\MailContentHandler.class.中的一个条件在第129行我们有:
if (contentDispositionFileName != null) {
submd.set("resourceName", contentDispositionFileName);
}通过使用其他块进行扩展:
if (contentDispositionFileName != null) {
submd.set("resourceName", contentDispositionFileName);
} else {
Map<String, String> contentTypeParameters = ((MaximalBodyDescriptor)body).getContentTypeParameters();
String contentTypeFilename = (String)contentTypeParameters.get("name");
submd.set("resourceName", contentTypeFilename);
}我们强制处理程序在内容类型参数中查找附加的文件名属性。
https://stackoverflow.com/questions/59033808
复制相似问题