Tika 检测多部分/签名
Posted
技术标签:
【中文标题】Tika 检测多部分/签名【英文标题】:Tika detect multipart/signed 【发布时间】:2015-02-08 11:00:24 【问题描述】:我正在使用 Tika 自动检测被推送到 DMS 中的文档的内容类型。除了电子邮件之外,几乎所有东西都可以正常工作。
我必须区分标准邮件消息 (mime => message/rfc822) 和签名邮件消息 (mime => multipart/signed),但所有电子邮件都被检测为 message/rfc822。
未正确检测到的签名邮件具有以下内容类型标头:
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----4898E6D8BDE1929CA602BE94D115EF4C"
我用来解析的java代码是:
Detector detector;
List<Detector> detectors = new ArrayList<Detector>();
detectors.add(new ZipContainerDetector());
detectors.add(new POIFSContainerDetector());
detectors.add(MimeTypes.getDefaultMimeTypes());
detector = new CompositeDetector(detectors);
String mimetype = detector.detect(TikaInputStream.get(new File(args[0])), new Metadata()).toString();
我正在引用核心库和 tika-parsers 来检测 pdf 和 msword 文档。我还缺少其他东西吗?
【问题讨论】:
您是否尝试升级到最新版本的 Apache Tika? 是的,版本 1.6 - 我没有找到二进制文件,只是我首先使用 Maven 更新编译的 Tika 网站上的源代码。有比 1.6 更新的版本吗? 1.7 原定于不久前发布,但已延迟。如果您已经使用 maven 从源代码构建,只需从 svn / git 签出最新(主干)代码并构建它以尝试最新版本! 我会尝试,我会告诉你结果。谢谢 我按照最新版本 (1.7) 的建议进行了尝试,但仍然无法区分“message/rfc822”和“multipart/signed”。我错过了一些检测器吗? 【参考方案1】:我解决了我的问题。我通过实现Detector
接口实现了一个自定义检测器:
public class MultipartSignedDetector implements Detector
@Override
public MediaType detect(InputStream is, Metadata metadata) throws IOException
TemporaryResources tmp = new TemporaryResources();
TikaInputStream tis = TikaInputStream.get(is, tmp);
tis.mark(Integer.MAX_VALUE);
try
MimeMessage mimeMessage = null;
String host = "host.com";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
mimeMessage = new MimeMessage(session, tis);
if(mimeMessage.getContentType() != null && mimeMessage.getMessageID() != null && mimeMessage.getContentType().toLowerCase().contains("multipart/signed"))
return new MediaType("multipart", "signed");
else
return MediaType.OCTET_STREAM;
catch(Exception e)
return MediaType.OCTET_STREAM;
finally
try
tis.reset();
tmp.dispose();
catch (TikaException e)
// ignore
然后将自定义检测器添加到默认检测器之前的复合检测器:
Detector detector;
List<Detector> detectors = new ArrayList<Detector>();
detectors.add(new ZipContainerDetector());
detectors.add(new POIFSContainerDetector());
detectors.add(new MultipartSignedDetector());
detectors.add(MimeTypes.getDefaultMimeTypes());
detector = new CompositeDetector(detectors);
String mimetype = detector.detect(TikaInputStream.get(new File(args[0])), new Metadata()).toString();
【讨论】:
与其手动将其添加为新的检测器,将其添加到自动检测列表中不是更容易吗?参见this for parsers,但添加到检测器服务文件中以上是关于Tika 检测多部分/签名的主要内容,如果未能解决你的问题,请参考以下文章