使用Content-Type标头从eml文件中提取附件名称

问题描述 投票:0回答:1

我正在使用Tika服务器解析一堆eml文件。使用/rmeta端点时,提取emls和附件的内容以及元数据都可以正常工作。

问题出现,带有正确的附件文件名。当原始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-Disposition中缺少文件名),即:

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-Type键来以某种方式访问​​提到的文件名属性,但是它不存在。 (我认为Tika不仅通过查看适当的标头来评估内容类型密钥,因此缺少所需的文件名)

因此,我的问题(由于我无法弄清),是否有一种方法可以修改Tika源代码,以在缺少Content-Disposition标头中的正确文件名属性时强制从Content-Type标头中提取文件名?

java mime-types apache-tika
1个回答
0
投票

好,所以我自己做。解决方法非常简单明了。

一个必须扩展\ org \ apache \ tika \ parser \ mail \ MailContentHandler.class]中的条件之一。在第129行,我们有:

if (contentDispositionFileName != null) {
   submd.set("resourceName", contentDispositionFileName);
}

通过扩展其他else

块:
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);
}

我们强制处理程序在内容类型参数中寻找其他文件名属性。

© www.soinside.com 2019 - 2024. All rights reserved.