2013-03-10 6 views
4

Мне нужно проверить currentFile MIME-типа. Если результат является успешным, а файл имеет MIME-тип return true. Если не был проверен succed return false.
С этой целью я использую JMimeMagic.
Я пытаюсь сделать это according this postПроверка MIME-типа с помощью JMimeMagic - MagicMatchNotFoundException

Выхода из этого кода - net.sf.jmimemagic.MagicMatchNotFoundException

Вы должны иметь JDK 7 - для изменения файла в байтах [] на этом пути (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) 

Если файл "ОК" тип => выход в консоль нормально. Но через некоторое время возникает другой исключение:

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) 

Вопрос:

  • Как решить эту проблему возникает исключение?

ответ

3

JMimeMagic 0.1.2 зависит от фонда Logging 1.0.4 NoClassDefFoundError означает, что виртуальная машина Java или экземпляр ClassLoader пытается загрузить в определении класса (как часть нормального вызова метода или как часть создания новый экземпляр с использованием нового выражения), и определение класса не может быть найдено. Решение состоит в том, чтобы добавить commons-logging-1.0.4.jar в ваш путь к классам.

Обратите внимание, что JMimeMagic имеет другой 3rd party dependencies:

  1. Джакарта ORO 2.0.8
  2. Log4j 1.2.8
  3. Xerces 2.4.0 (факультативно)
  4. XML-интерфейсы 2.0.2
  5. xmlParserAPIs 2.0.2

Update - MagicMatchNotFoundException

MagicMatchNotFoundException вызывается, если для предоставленных данных не найдено совпадение типа mime. Вы можете установить уровень регистрации net.sf.jmimemagic в DEBUG, чтобы получить больше информации о том, что происходит на

Update 2 - OutOfMemoryError

ООМ выглядит связано с поведением JmimeMagic. В некоторых случаях он попытается запустить регулярное выражение для ввода всего массива байтов, чтобы найти совпадение магического числа.См. Это сообщение issue для платформы Nuxeo Enterprise.
Я думаю, что вы можете решить эту проблему, ограничив размер массива байтов, который вы переходите на getMagicMatch

+0

«Commons-logging-1.0.4.jar' означает' Log4j 1.2.8'? –

+1

нет, 2 разных библиотеки –

+0

Я добавил библиотеку 'commons-logging-1.1.1.jar'. Вывод на консоль (в красном цвете): 'мар 11, 2013 2:00:36 PM net.sf.jmimemagic.MagicParser endElement INFO: endElement(): не добавляет недопустимый матчи '320 kBits'' ...' NoClassDefFoundError : org/apache/oro/text/perl/Perl5Util' –