Получение mime типа по содержимому файла

WEBproger

Новичок
Получение mime типа по содержимому файла

Задача собственно в заголовке Темы. Хотелось бы увидет ссылочку с подробным описание формата или спецификацией файла magic.mime (то что написано в самом файле ничтожно мало и не позволяет корректно разобрать этот файл) или реализацию алгоритма поиска типа на каком нибудь из распростаненных языков программирования (PHP вообще золотой вариант).

Сразу просьба, НЕ советовать использовать mime_content_type или FileInfo, эти способы не подходят...

Заранее спасибо.
 

WEBproger

Новичок
Чесслово, перерыл этот поиск, да и гугл привлекал, но ответа на интересующий меня вопрос я не нашел. Там написано "юзайте mime_content_type" или "Использовать расширение Fileinfo из PECL". Но ОПИСАНИЯ ФОРМАТА magic.mime или ссылок на алгоритмы разбора этого файла я там не видел.
 

alexcrown

Новичок
Вроде комментарии в самом файле mime.magic достаточно подробно описывают его структуру?
 

WEBproger

Новичок
просто ответа на вопрос что означает конструкция lelong&0377777777 к примеру я не нашел... А так да, на большинство вопросов я нешел там ответ.
вот нашел кое что, близкое к правде, хотя можно и по подробнее. http://www.openbsd.org/cgi-bin/man.cgi?query=magic&sektion=5&arch=&apropos=0&manpath=OpenBSD+Current.
Может кому пригодится...
 

WEBproger

Новичок
Автор оригинала: FractalizeR
Документация есть тут: http://httpd.apache.org/docs/1.3/mod/mod_mime_magic.html
Респект :)

Выкладываю наш скрипт, может комуто пригодится:
PHP:
<?php
     function load_mime_file($path)
     {
          $rg='/^((?:0x)?[\da-f]+)\s+(\w+)(?:[\&]((?:0x)?[\da-f]+))?\s+([\>\<\=\&\\^]?)((??:\\\\.)|[^\\\\\\s])*)\s+(.*)$/';     //

          $r=file($path);
          $result=array();
          foreach($r as $row)
          {
               if(($row[0]=='#')||($row[0]=='>'))continue;
               $match=array();
             if(preg_match($rg,$row,$match))
               {
                    $match[1]=$match[1]*1;
                    if(!$match[3]) $match[3]=0xffffffff; else $match[3]=$match[3]*1;
                    if(!$match[4]) $match[4]='=';
                    if($match[2]=='string')
                    {
                         $match[5]=stripcslashes($match[5]);
                    }else{
                         $match[5]=$match[5]*1;
                    }
                    array_push($result,$match);
               }
          }
          return $result;
     }
     $mimemagic=load_mime_file($_SERVER['DOCUMENT_ROOT'].'/magic.mime');
     function get_mime_type($file)
     {
          global $mimemagic;
          $fl=fopen($file,'rb');
          foreach($mimemagic as $mimeentry)
          {
               fseek($fl,$mimeentry[1],SEEK_SET);
               if($mimeentry[2]=='string'){
                    $val=fread($fl,strlen($mimeentry[5]));
                    if($val==$mimeentry[5])return $mimeentry[6];
               }else{
                    $val=null;
                    switch($mimeentry[2])
                    {
                         case 'byte':      $val=@unpack('c',@fread($fl,1)); break;
                         case 'ubyte':      $val=@unpack('C',@fread($fl,1)); break;

                         case 'short':      $val=@unpack('s',@fread($fl,2)); break;
                         case 'ushort':      $val=@unpack('S',@fread($fl,2)); break;
                         case 'leshort': $val=@unpack('v',@fread($fl,2)); break;
                         case 'uleshort':$val=@unpack('v',@fread($fl,2)); break;
                         case 'beshort': $val=@unpack('n',@fread($fl,2)); break;
                         case 'ubeshort':$val=@unpack('n',@fread($fl,2)); break;

                         case 'long':      $val=@unpack('l',@fread($fl,4)); break;
                         case 'ulong':      $val=@unpack('L',@fread($fl,4)); break;
                         case 'lelong':      $val=@unpack('V',@fread($fl,4)); break;
                         case 'ulelong':     $val=@unpack('V',@fread($fl,4)); break;
                         case 'belong':      $val=@unpack('N',@fread($fl,4)); break;
                         case 'ubelong':     $val=@unpack('N',@fread($fl,4)); break;
                    }
                    if(is_null($val))continue;
                    $val=$val[1];
                    $val&=$mimeentry[3];
                switch($mimeentry[4])
                    {
                         case '=': if($val==$mimeentry[5]){     fclose($fl); return $mimeentry[6];} break;
                         case '>': if($val>$mimeentry[5]){     fclose($fl); return $mimeentry[6];} break;
                         case '<': if($val<$mimeentry[5]){     fclose($fl); return $mimeentry[6];} break;
                         case '&': if($val&$mimeentry[5]){     fclose($fl); return $mimeentry[6];} break;
                         case '^': if($val&(~$mimeentry[5])){fclose($fl); return $mimeentry[6];} break;
                    }
               }
          }
          fclose($fl);
     }
     echo ':::'.get_mime_type($_SERVER['DOCUMENT_ROOT'].'/cursor.jpg').':::';
     echo ':::'.get_mime_type($_SERVER['DOCUMENT_ROOT'].'/help_or.png').':::';
?>
 

ra6fnv

Новичок
Воспользовался данным исходником ... но лезут ошибки при загрузке файла с MIME типами при каждой итерации чтения строк:
Warning: Compilation failed: unrecognized character after (? at offset 73 in z:\home\edu_srv.ru\www\admin\inc\download_inc.php on line 16

Строка 16: if(preg_match($rg,$row,$match))

Регулярное выражение слишком сложное - пытался разобраться но не получилось :( Не подскажите в чем проблема ??
 

kruglov

Новичок
Написано же, ошибка начинается в 73 символе регулярки.

[^\\\\\\s] - это чего за "баян"?
 

errd

Новичок
Re: Получение mime типа по содержимому файла

Автор оригинала: WEBproger
Сразу просьба, НЕ советовать использовать mime_content_type или FileInfo, эти способы не подходят...
Заранее спасибо.
Почему не подходят?
 
Сверху