Java 使用内容类型头从eml文件中提取附件名称
我正在使用Tika服务器解析一堆eml文件。在使用Java 使用内容类型头从eml文件中提取附件名称,java,mime-types,apache-tika,Java,Mime Types,Apache Tika,我正在使用Tika服务器解析一堆eml文件。在使用/rmeta端点时,提取EML和附件的内容和元数据效果良好 正确的附件文件名出现问题。当原始eml文件中的附件部件具有以下结构时: Content-Type: application/pdf; name="filename_a.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="filename_a.pdf" 一切正常:元数据对象(在
/rmeta
端点时,提取EML和附件的内容和元数据效果良好
正确的附件文件名出现问题。当原始eml文件中的附件部件具有以下结构时:
Content-Type: application/pdf; name="filename_a.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="filename_a.pdf"
一切正常:元数据对象(在api响应中)中提取的文件名路径为:
但是,我的一些电子邮件的标题结构不正确(内容处置中缺少文件名),即:
然后在解析整个eml后,我得到:
"X-TIKA:embedded_resource_path": "/embedded-1"
我在Tika的源代码中检查了filename meta是在\org\apache\Tika\parser\RecursiveParserWrapper.class中定义的:
我试图通过检查元数据对象中的内容类型键来访问不知何故提到的filename属性,但它不存在。(我假设Tika评估内容类型键不仅仅是通过查看适当的标题,因此缺少所需的文件名)
因此,我的问题是(因为我无法理解它)有没有一种方法可以修改Tika源代码,在内容处置头中缺少正确的文件名属性时,强制从内容类型头提取文件名?好的,所以我自己管理。解决方法简单明了 必须扩展\org\apache\tika\parser\mail\MailContentHandler.class中的一个条件。在第129行中,我们有:
if (contentDispositionFileName != null) {
submd.set("resourceName", contentDispositionFileName);
}
通过使用其他else块进行扩展:
if(contentDispositionFileName!=null){
submd.set(“resourceName”,contentDispositionFileName);
}否则{
映射contentTypeParameters=((MaximalBodyDescriptor)body.getContentTypeParameters();
字符串contentTypeFilename=(字符串)contentTypeParameters.get(“名称”);
submd.set(“resourceName”,contentTypeFilename);
}
我们强制处理程序在内容类型参数中查找附加的filename属性
"X-TIKA:embedded_resource_path": "/embedded-1"
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;
}
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);
}