Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用内容类型头从eml文件中提取附件名称_Java_Mime Types_Apache Tika - Fatal编程技术网

Java 使用内容类型头从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" 一切正常:元数据对象(在

我正在使用Tika服务器解析一堆eml文件。在使用
/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);
}