【问题标题】:How to add new mime type to apache tika如何向 apache tika 添加新的 mime 类型
【发布时间】:2015-09-02 22:26:29
【问题描述】:

这是我阅读哑剧类型的课程。我正在尝试添加一个新的 mime 类型(属性文件)并阅读它。

这是我的类文件:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package check_mime;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.tika.Tika;
import org.apache.tika.mime.MimeTypes;


public class TikaFileTypeDetector {

    private final Tika tika = new Tika();

    public TikaFileTypeDetector() {
        super();
    }

    public String probeContentType(Path path) throws IOException {

        // Check contents first
        String fileContentDetect = tika.detect(path.toFile());
        if (!fileContentDetect.equals(MimeTypes.OCTET_STREAM)) {
            return fileContentDetect;
        }

        // Try file name only if content search was not successful
        String fileNameDetect = tika.detect(path.toString());
        if (!fileNameDetect.equals(MimeTypes.OCTET_STREAM)) {
            return fileNameDetect;
        }

        return null;
    }

    public static void main(String[] args) throws IOException {

        Tika tika = new Tika();

        if (args.length != 1) {
            printUsage();
            return;
        }
        Path path = Paths.get(args[0]);

        TikaFileTypeDetector detector = new TikaFileTypeDetector();

        String contentType = detector.probeContentType(path);

        System.out.println("File is of type - " + contentType);
    }

    public static void printUsage() {
        System.out.print("Usage: java -classpath ... "
                + TikaFileTypeDetector.class.getName()
                + " ");
    }
}

docs我创建了一个自定义xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <mime-info>
   <mime-type type="text/properties">
          <glob pattern="*.properties"/>
   </mime-type>
 </mime-info>

现在我如何添加到我的程序并阅读它。我必须创建一个解析器吗?我被困在这里了。

【问题讨论】:

    标签: java apache-tika


    【解决方案1】:

    Tika 将通过 Java 资源加载检测您的自定义定义,并自动将其添加到自己的定义中:为此,您需要将其命名为 custom-mimetypes.xml 并将其放入代码库中的 org.apache.tika.mime 包中。

    如果您从类创建 jar 文件,您还需要在 jar 中包含您的 custom-mimetypes.xml。

    【讨论】:

    • 你指的是哪个包?我的项目中有 java 包吗?
    • 所以我只是创建一个名为org.apache.tika.mime 的包并添加自定义xml文件?
    • 我得到异常:Exception in thread "main" java.lang.RuntimeException: Unable to parse the default media type registry
    • 那是因为您的 custom-mimetypes.xml 包含错误:“属性文件”在语法上不是有效的 mimetype。像这样写:。但是 *.properties 已经由 Tika 核心定义,它会为其返回 mimetype text/plain。
    • 我希望它检测为文本/属性文件而不是文本/纯文本类型
    【解决方案2】:

    Apache Tika 5 minute parser instructions 对此进行了介绍。要添加对 Java .properties 文件的支持,您应该首先创建一个名为 custom-mimetypes.xml 的文件并使用以下内容填充它:

    <?xml version="1.0" encoding="UTF-8"?>
    <mime-info>
      <mime-type type="text/properties">
         <_comment>Java Properties</_comment>
         <glob pattern="*.properties"/>
         <sub-class-of type="text/plain"/>
       </mime-type>
    </mime-info>
    

    接下来,您需要将其放在 Tika 可以找到的位置,并使用正确的名称。它必须在您的类路径中存储为org/apache/tika/mime/custom-mimetypes.xml。最简单的做法是创建该目录结构,将新文件移入其中,然后将根目录添加到您的类路径中。对于部署,您应该将其包装到一个 jar 中并将其放在类路径中

    如果您小心的话,您可以使用 Tika 应用程序检查您的 mime 类型文件是否已加载。将您的代码打包为 jar,以如下方式运行它:

    java -classpath tika-app-1.10-SNAPSHOT.jar:my-custom-mimetypes.jar org.apache.tika.cli.TikaCLI --list-supported-types | grep text/properties
    

    或者,如果你有它在本地目录中,尝试类似

    ls -l org/apache/tika/mime/custom-mimetypes.xml
    # Check a file was found, with some content in it
    java -classpath tika-app-1.10-SNAPSHOT.jar:. org.apache.tika.cli.TikaCLI --list-supported-types | grep text/properties
    

    如果这没有显示您的 MIME 类型,则说明您的路径或文件名不正确,请仔细检查它们

    (或者,升级到更新版本的 Apache Tika,因为 r1686315 Tika 内置了 Java Properties mimetype!)

    【讨论】:

    • "然后将根目录添加到你的类路径"??我正在使用 netbeans IDE,我在其中创建了一个名为 org.apache.tika.mime 的包,其中包含此文件 custom-mimetypes,其内容如上所述
    • 我不知道netbeans,抱歉。新的自定义 mimetypes 文件 必须 存在于类路径中,并且具有确切的路径 org/apache/tika/mime/custom-mimetypes.xml - 其上的任何前缀或路径的缺失位都意味着 Tika 无法识别它
    • 是的,自定义 xml 文件存在于类路径中。这是 netbeans = Check_Mime\build\classes\org\apache\tika\mime\custom-mimetypes.xml 中的目录结构,并且类文件位于同一位置
    • Check_Mime 是项目名称
    • 关于 org.apache.tika.cli.TikaCLI 检查的重要提示!
    【解决方案3】:
    MediaType mediaType = detector.detect(stream, metadata);
            System.out.println("Detected Media Type: " + mediaType.toString());
            MimeType mimeType = config.getMimeRepository().forName(mediaType.toString());
            String extension = mimeType.getExtension();
    

    【讨论】:

    • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。 - From Review
    • 如何添加新的 mime 类型?它似乎所做的只是获取一个现有的
    【解决方案4】:

    在您的resources 文件夹中添加包org\apache\tika\mime 并创建文件custom-mimetypes.xml

    输入以下代码

    <?xml version="1.0" encoding="UTF-8"?>
    <mime-info>
      <mime-type type="custom-mime-type">
        <glob pattern="*.custom-extension"/>
      </mime-type>
    </mime-info>
    

    custom-mime-type 替换为您的mime 类型,将custom-extension 替换为您的扩展名。 请检查下面的目录结构。

    顺便说一句,您还可以通过下载该文件并将 custom-mimetypes.xml 放在本地加载 tike mime-types 。这仅在您需要更改标准 tike mime-types 时才有用。需要记住的一件事是,两个 xml 中不能有相同的 mime 类型/扩展名。

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 2012-01-19
      • 2015-10-10
      • 1970-01-01
      • 2022-01-06
      • 2011-08-10
      • 2010-09-07
      • 2014-04-05
      相关资源
      最近更新 更多