首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用内容类型标头从eml文件中提取附件名称

使用内容类型标头从eml文件中提取附件名称
EN

Stack Overflow用户
提问于 2019-11-25 14:14:08
回答 1查看 829关注 0票数 0

我正在使用Tika-server解析一堆eml文件。在使用/rmeta端点时,提取eml和附件的内容和元数据很好。

正确的附件文件名出现问题。当原始eml文件中的附件部分具有以下结构时:

代码语言:javascript
复制
Content-Type: application/pdf; name="filename_a.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="filename_a.pdf"

所有操作都很好:元数据对象中提取的文件名路径(在api响应中)是:

代码语言:javascript
复制
"X-TIKA:embedded_resource_path": "/filename_a.pdf"

然而,我的一些电子邮件有格式错误的标题结构(在内容处理中缺少文件名),即:

代码语言:javascript
复制
Content-Type: application/pdf; name="filename_a.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;

然后,在解析完整个eml之后,我得到:

代码语言:javascript
复制
"X-TIKA:embedded_resource_path": "/embedded-1"

我在Tika的源代码中检查了文件名meta是在\org\apache\tika\parser\RecursiveParserWrapper.class中定义的:

代码语言:javascript
复制
 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源代码,在内容处理标题中缺少适当的文件名属性时,强制从内容类型标头中提取文件名?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 13:56:45

好吧,所以我自己解决了。解决办法是简单明了的。

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

代码语言:javascript
复制
if (contentDispositionFileName != null) {
   submd.set("resourceName", contentDispositionFileName);
}

通过使用其他块进行扩展:

代码语言:javascript
复制
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);
}

我们强制处理程序在内容类型参数中查找附加的文件名属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59033808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档