【问题标题】:Tika configuration for ZIP parserZIP 解析器的 Tika 配置
【发布时间】:2022-11-10 23:49:27
【问题描述】:

是否可以告诉 Tika 或解析器 ZIP 只能包含具有特定 MimeType 或文件扩展名的文件?

iam 当前使用的是递归解析器来获取每个文件的所有信息。

     final ParseContext context = new ParseContext();
     final ContentHandlerFactory contentHandlerFactory = new BasicContentHandlerFactory( BasicContentHandlerFactory.HANDLER_TYPE.TEXT, -1 );
     final RecursiveParserWrapperHandler recursiveParserWrapperHandler = new RecursiveParserWrapperHandler( contentHandlerFactory );
     final RecursiveParserWrapper parser = new RecursiveParserWrapper( autoDetectParser );
     context.set( Parser.class, parser );
     parser.parse( tikaInputStream, recursiveParserWrapperHandler, metadata, context );

我正在寻找一个 zip 只能包含一种文件类型并且不能包含任何其他 zip/容器的解决方案。目前我正在手动执行此操作,但也许有更好的解决方案。尤其是在拉链轰炸方面,另一种解决方案更有意义。

        final String contentType = metadata1.get( Metadata.CONTENT_TYPE );
        final MediaType mediaType = MediaType.parse( contentType );
        final MediaType expectedMediaType = MediaType.text( "turtle" );
        final String depth = metadata1.get( TikaCoreProperties.EMBEDDED_DEPTH );

        if ( MediaType.APPLICATION_ZIP.equals( mediaType ) ) {
           if ( Integer.parseInt( depth ) > 0 ) {
              throw new RuntimeException( "Not allowed depth path" );
           }
           return;
        }

        if ( !expectedMediaType.equals( mediaType ) ) {
           throw new RuntimeException( "Not allowed media type" );
        }

【问题讨论】:

  • 如果 Apache Tika 在 zip 中找到任何其他文档类型,您希望 Apache Tika 做什么?
  • @Gagravarr 添加了更多上下文
  • 然后我会做一个自定义递归处理程序,如果它匹配允许的类型调用真正的解析器来完成工作,否则中止

标签: apache-tika


【解决方案1】:

我添加了一个自己的 RecursiveParserWrapperHandler。这是一个达到最大嵌入计数时引发异常的示例。

public class ZipHandler extends RecursiveParserWrapperHandler {

  private static final int MAX_EMBEDDED_ENTRIES = 10000;

  public ZipHandler( final ContentHandlerFactory contentHandlerFactory ) {
     super( contentHandlerFactory, MAX_EMBEDDED_ENTRIES );
  }

  @Override
  public void endDocument( final ContentHandler contentHandler, final Metadata metadata ) throws SAXException {
     if ( hasHitMaximumEmbeddedResources() ) {
        throw new SAXException( "Max embedded entries reached: " + MAX_EMBEDDED_ENTRIES );
     }
     super.endDocument( contentHandler, metadata );
  } 
}

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2019-04-05
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多