【问题标题】:MIME-type checking with JMimeMagic - MagicMatchNotFoundException使用 JMimeMagic 进行 MIME 类型检查 - MagicMatchNotFoundException
【发布时间】:2013-02-25 19:55:48
【问题描述】:

我需要检查 MIME 类型的 currentFile。如果结果成功并且文件具有 MIME 类型 return true。如果没有检查成功return false.
为了这个目标,我使用JMimeMagic
我尝试这样做according this post

此代码的输出是 - net.sf.jmimemagic.MagicMatchNotFoundException

您需要 JDK 7 - 以这种方式将 File 更改为 byte[] (Files.readAllBytes(path))。

代码:

    class ProbeContentTypeCheker implements Checker {

    @Override
    public boolean check(File currentFile) {
        String mimeType = null;
        try {
            Path path = Paths.get(currentFile.getAbsolutePath());
            byte[] data = Files.readAllBytes(path);
            MagicMatch match = Magic.getMagicMatch(data);
            mimeType = match.getMimeType();
        } catch (MagicParseException | MagicMatchNotFoundException
                | MagicException | IOException e) {
            e.printStackTrace();
        }

        if (null != mimeType) {
            return true;
        }

        return false;
    }
}

输出(仅当它是“错误”类型时):

 net.sf.jmimemagic.MagicMatchNotFoundException
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:222)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170)
    at task.ProbeContentTypeCheker.check(FileScan.java:357)
    at task.FolderScan.findFiles(FileScan.java:223)
    at task.FolderScan.findFiles(FileScan.java:215)
    at task.FolderScan.run(FileScan.java:202)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)  

如果文件是“ok”类型 => 输出到控制台正常。但过了一段时间又出现了另一个异常

Exception in thread "pool-1-thread-1" java.lang.OutOfMemoryError: Java heap space
    at java.lang.String.toCharArray(String.java:2753)
    at org.apache.oro.text.perl.Perl5Util.match(Unknown Source)
    at net.sf.jmimemagic.MagicMatcher.testRegex(MagicMatcher.java:663)
    at net.sf.jmimemagic.MagicMatcher.testInternal(MagicMatcher.java:433)
    at net.sf.jmimemagic.MagicMatcher.test(MagicMatcher.java:341)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:208)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170)
    at task.ProbeContentTypeCheking.check(FileScan.java:384)
    at task.FolderScan.findFiles(FileScan.java:228)
    at task.FolderScan.findFiles(FileScan.java:225)
    at task.FolderScan.findFiles(FileScan.java:225)
    at task.FolderScan.run(FileScan.java:209)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

问题:

  • 出现异常如何解决?

【问题讨论】:

    标签: java exception mime-types


    【解决方案1】:

    JMimeMagic 0.1.2 依赖于 Commons Logging 1.0.4 NoClassDefFoundError 表示 Java 虚拟机或 ClassLoader 实例尝试加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且没有类的定义可以找到。 解决方案是将 commons-logging-1.0.4.jar 添加到您的类路径中。

    请注意,JMimeMagic 还有其他3rd party dependencies

    1. 雅加达 ORO 2.0.8
    2. Lo​​g4j 1.2.8
    3. Xerces 2.4.0(可选)
    4. xml-apis 2.0.2
    5. xmlParserAPIs 2.0.2

    更新 - MagicMatchNotFoundException

    如果未找到与提供的数据匹配的 mime 类型,则会抛出 MagicMatchNotFoundException。 您可以将 net.sf.jmimemagic 的日志级别设置为 DEBUG 以获取有关正在发生的事情的更多信息

    更新 2 - OutOfMemoryError

    OOM 看起来与 JmimeMagic 的行为有关。在某些情况下,它会尝试对整个字节数组输入运行正则表达式以找到幻数匹配。有关 Nuxeo 企业平台,请参阅此报告的 issue
    我认为你可以通过限制传递给getMagicMatch的字节数组的大小来解决这个问题

    【讨论】:

    • commons-logging-1.0.4.jar 是否意味着Log4j 1.2.8
    • 我添加了库commons-logging-1.1.1.jar。输出到控制台(红色):мар 11, 2013 2:00:36 PM net.sf.jmimemagic.MagicParser endElement INFO: endElement(): not adding invalid matcher '320 kBits' ... NoClassDefFoundError: org/apache/oro/text/perl/Perl5Util
    • 您需要添加我在答案中指定的所有其他库
    • 请将完整的堆栈跟踪添加到您的问题中
    • 仅适用于每个“坏”文件。如果它是“好的”文件=>以正常方式输出。结果这次运行是java.lang.OutOfMemoryError: Java heap space。为什么会发生这种情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2018-10-30
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多