2010-05-20 11 views
8

Existe-t-il un moyen décent en PHP pour obtenir le type mime?PHP, Comment obtenir Mime Type - Mission Impossible?

je cherche intensivement depuis quelques heures et il semble qu'il y ait trois façons principales, ce qui dans chaque sens des problèmes:

  1. mime_content_type() C'est dépréciée, beaucoup de temps pas installé et, s'il est installé, ne trouvera parfois pas le fichier mime.magic.

  2. file_info N'a pas été installé sur les hôtes que j'ai essayé, ne semble pas avoir un très bon support. Est une extension (PECL). Shell_exec (fichier -ib $ $) Ne fonctionne pas sur les serveurs Windows. Je l'ai essayé sur un serveur Linux et il m'a donné "image/x-3ds2" pour un fichier php. Qu'est-ce que c'est que ça!!!

Qu'est-ce qu'un bon moyen, presque à l'épreuve des balles, d'obtenir le type mime d'un fichier?

+0

double possible [Comment puis-je trouver le type MIME d'un fichier avec php?] (Http://stackoverflow.com/ questions/134833/how-do-je-trouver-le-mime-type-d'un fichier-avec-php) –

+0

Euh, je suis abit confus. J'ai lu ce post en fait, mais je ne peux pas trouver de bonnes réponses, je veux dire, je ne peux pas trouver des réponses acceptables, cela signifie-t-il, je ne peux pas poster une question similaire à l'avenir s'il n'y a pas encore de réponse absolue? Quelles sont les règles de SO? Je veux savoir, pour que je puisse suivre =) – mysqllearner

+0

Et je pense que ce post (http://stackoverflow.com/questions/134833/how-do-i-find-the-mime-type-of-a-file -with-php) a été demandé il y a 1 an, je doute qu'il y aurait de nouvelles réponses = – mysqllearner

Répondre

2

Pour contourner ce problème, vous pouvez utiliser la fonction "mime.php" extension de http://upgradephp.berlios.de/ Il simule les mime_content_type() si non disponible. Fait spécifiquement pour de tels cas.

Vous pouvez installer votre fichier mime.magic privé et le forcer avec ini_set ("mime_magic.magicfile"). Ceci est recommandé de toute façon, de sorte que vous avez les paramètres souhaités disponibles.

+0

mime.php est inachevé, et je viens de le tester, ça ne fonctionne pas :( –

0

Chris Jean a développé a function called get_file_mime_type qui tente d'abord d'utiliser la méthode finfo_open, puis retombe à la mime_content_type, puis finalement retombe à un simple tableau extension => mime_type. Cela fonctionne bien pour moi quand les deux premières options n'étaient pas disponibles sur mon serveur. Beats avoir à écrire la fonction moi-même!

0

Vous pouvez utiliser le magic numbers, consulter d'autres listes de signatures de fichiers (like this one here), puis vérifier les données binaires pour le premier octet.

function getfiletype($file) { 
    $handle = @fopen($file, 'r'); 
    if (!$handle) 
     throw new Exception('File error - Can not open File or file missing'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 
        'gif' => 'GIF', 
        'bmp' => 'BM', 
        'tiff' => '\x49\x20\x49', 
        'png' => "\x89\x50\x4e\x47\x0d\x0a", 
        'psd' => '8BPS', 
        'swf' => 'FWS'); 

    $bytes = fgets($handle, 8); 
    $filetype = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $filetype = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $filetype; 
} 

Ceci est en fait une fonction de remplacement très simple pour file_info(), qui fonctionne de la même manière, mais sur une étendue beaucoup plus (et moins) niveau.

alternative est d'utiliser une classe php externe déjà comme this one par exemple ..