carpeta de extensionesHaciendo un proyectillo de control de archivos online me he topado con otra carencia de datos. Intentaba obtener la cabecera MIME de un archivo para determinar su tipo y poder aplicarle un filtro u otro a la hora de mostrar sus características. Mi problema encontró una flaca solución con la función de PHP mime_content_type() la cual ha sido dejada de actualizar en favor de finfo_file() la cual es parte del PECL cosa por la cual termine por desechar la opción de utilizarlo.
Por esto pase a la acción y pense en hacer un array con las extensiones como claves y los tipos MIME como valor, pero este me quedo muy grande e incompleto así que pase a la regla genérica de la informática... no duplicar contenido, y pregunte al oráculo de donde podía sacar datos MIME de las extensiones de archivo y encontré filext.com, pagina que nos da datos de que es, de quien y con que programa se abre un archivo determinado a partir de su extensión, sin contar con la cabecera MIME (si la tienen almacenada). Y como siempre, aquí esta la función que muestra los datos dentro del PHP.
(la función utiliza el código embebido de la misma web, si esta cambia de diseño puede que se produzcan fallos en el funcionamiento del mismo).

PHP:
  1. function fileformatinfo($ext){
  2.     $contenido  = str_replace( array("\n", '<td></td>'), '', file_get_contents('http://filext.com/file-extension.php?extension='.$ext) );
  3.     $exp_info   = '!<table width="100%" border="1"(.+)<\/table>!U';
  4.     preg_match_all($exp_info,$contenido,$mime);
  5.     foreach($mime[1] as $k => $v){
  6.         $mime[$k] = explode('<tr>', $v);
  7.     }
  8.     $out['name']    = substr($mime[0][3], strpos($mime[0][3], '>')+1, strpos(substr($mime[0][3], strpos($mime[0][3], '>')+1), '   ') );
  9.     $out['info']    = substr($mime[0][5], strpos($mime[0][5], '>')+1, strpos(substr($mime[0][5], strpos($mime[0][5], '>')+1), '[') );
  10.     $out['ext' ]    = explode(' <br> ', substr($mime[0][9], strpos($mime[0][9], '>')+1, strpos(substr($mime[0][9], strpos($mime[0][9], '>')+1), '</t') ) );
  11.     $out['type']    = explode(' <br> ', substr($mime[0][11], strpos($mime[0][11], '>')+1, strpos(substr($mime[0][11], strpos($mime[0][11], '>')+1), '<') ) );
  12.     $out['used']    = substr($mime[0][13], strpos($mime[0][13], '>')+1, strpos(substr($mime[0][13], strpos($mime[0][13], '>')+1), " ") );
  13.     $out['mime']    = explode(' <br> ', substr($mime[0][7], strpos($mime[0][7], '<td>')+4, strpos(substr($mime[0][7], strpos($mime[0][7], '<td>')+4), '</td>') ));
  14.     $out['mime']    = substr($out['mime'][0], 0, 1) == '<' ? '' : $out['mime'];
  15.     $out['link']    = substr($mime[0][7], strpos($mime[0][7], '<li>')+4, strpos(substr($mime[0][7], strpos($mime[0][7], '<li>')+4), '</li>') );
  16.     $out['urlInfoFont' ]    = 'http://filext.com/file-extension.php?extension='.$ext;
  17.     unset($mime);
  18.     return $out;
  19. }

La función no puede tener un uso mas simple.. le introducimos como único parámetro la extension del archivo y nos da como resultado un array con los diferentes datos del archivo.
Algunos resultados pueden aparecer como array o string según si hay contenido o no como sucede con el contenido MIME.

y por ultimo aquí os va algunos ejemplos rápidos, que lo disfrutéis ;)

Ejemplo con FLV

PHP:
  1. print_r(fileformatinfo('flv'));

Ejemplo con EXE

PHP:
  1. $extension = 'exe';
  2. $informacion = fileformatinfo($extension);
  3. print_r($informacion);

Ejemplo con ZIP

PHP:
  1. $informacion = fileformatinfo('ZIP');
  2. print_r($informacion['mime']);

Ejemplo con RAR

PHP:
  1. $informacion = fileformatinfo('RAR');
  2. echo $informacion['name'];