Il est souvent utile de transmettre le type MIME d'un fichier à une fonction (de téléchargement de fichiers, d'envoi de mail au format Mime, etc.). Pour cela, PHP nous offre 2 outils bien pratiques :
- la fonction "mime_content_type()" : elle détecte le type Mime d'un fichier. Utilisable à partir de PHP version 4.3.0, elle est à présent officiellement déconseillée.
- l'extension "FileInfo" : elle permet de récupérer diverses informations sur les fichiers. Elle ne fait pas partie intégrante de PHP, il faut l'installer manuellement sur le serveur.
Si dans un environnement de développement local, il est tout à fait envisageable d'utiliser ces outils, en pratique, dans un environnement de production, cela est souvent impossible. Pour 2 raisons principalement : soit l'extension concernée n'est pas disponible, soit la version de PHP installée sur le serveur est trop ancienne.
De plus, l'utilisation de la fonction "mime_content_type()" est liée à l'accès aux informations présentes dans le fichier "mime.magic" du serveur. Or, ce fichier n'est pas toujours à jour, et impossible à éditer (son format est incompréhensible pour l'homme, et vous n'avez pas forcément les droits de modification sur le fichier).
J'ai donc développé une fonction "typeMime()" qui n'est ni plus ni moins qu'une réécriture de la fonction "mime_content_type()" ! Elle se base sur le fichier "mime.ini" qui a une syntaxe comparable aux fichiers de configuration de PHP ou d'Apache (cf. fichier "php.ini"). Vous pourrez donc l'éditer sans difficulté pour ajouter de nouveaux types Mime.
Cette fonction ne reçoit qu'un seul argument : le nom de fichier dont on doit déterminer le type. La détection du type se basant uniquement sur l'extension de fichier présente dans le nom transmis, vous devez vous assurer que le nom comporte bien une telle extension. Exemple :
<?php
$nomFichier="un_document_Word.doc"; // l'extension est ".doc"
$typeFichier=typeMime($nomFichier);
echo "Le type MIME du fichier '".$nomFichier."' est : ".$typeFichier.".";
?>
function typeMime($nomFichier) /* retourne le type MIME à partir de l'extension de fichier contenu dans $nomFichier Exemple : $nomFichier = "fichier.pdf" => type renvoyé : "application/pdf" */ { // on détecte d'abord le navigateur, ça nous servira plus tard if(preg_match("@Opera(/| )([0-9].[0-9]{1,2})@", $_SERVER['HTTP_USER_AGENT'], $resultats)) $navigateur="Opera"; elseif(preg_match("@MSIE ([0-9].[0-9]{1,2})@", $_SERVER['HTTP_USER_AGENT'], $resultats)) $navigateur="Internet Explorer"; else $navigateur="Mozilla";
// on récupère la liste des extensions de fichiers et leurs types Mime associés $mime=parse_ini_file("mime.ini"); $extension=substr($nomFichier, strrpos($nomFichier, ".")+1);
/* on affecte le type Mime si on a trouvé l'extension sinon le type par défaut (un flux d'octets). Attention : Internet Explorer et Opera ne supporte pas le type MIME standard */ if(array_key_exists($extension, $mime)) $type=$mime[$extension]; else $type=($navigateur!="Mozilla") ? 'application/octetstream' : 'application/octet-stream';
Bonjour,
Ce n'est pas le sujet, mais moi je voudrais vérifier l'entête d'un fichier mp3 avant téléchargement, donc savoir si c'est un vrai mp3 et pas un jpg renomé en mp3 par ex.
Existe-t'il un code pour cette opération, je cherche.. en vain...
merci
CedX 20/02/07
Teste une bibliothèque de lecture des tags ID3. Si la bibliothèque ne peut pas lire les tags, c'est que ton fichier n'est pas un MP3.
Y'en a une sur PEAR : http://pear.php.net/package/MP3_Id/
xeno 11/04/07
Bonjour,
Juste un petit commentaire d'encouragement pour CedX qui m'a fait gagner un temps précieux avec ce code.
encore merci.
Elooo 20/04/07
Bonjour,
J'essaie d'utiliser ce code mais il ne va jamais chercher dans mon fichier mime.ini, il me dit toujours que le type du fichier est "application/octet-stream". Auriez-vous une idée ?
Merci d'avance
CedX 20/04/07
Cela vient probablement du fait que le fichier "mime.ini" n'est pas situé au bon endroit.
Il faut donc modifier la ligne :
$mime=parse_ini_file("mime.ini");
Et mettre le chemin adéquat, par exemple :
$mime=parse_ini_file("/serveur/application/mime.ini");
jaguard 17/08/07
Genial !!! ça fonctionne à merveille mais... en local
Cette fonction intégré dans un prog. très complexe, la fonction a parfaitement remplie son rôle sur un test an local.
Mais sans trop déranger, j'aimerai malgré tout une confirmation sur l'implantation du fichier mime.ini
dossier du site : menier sous dossier pub
j'ai tout mis dans le dossier pub : prog + fonction + mime.ini
Si je fais la même chose sur le serveur d'hebergement il n'y a aucune raison que ça ne fonctionne pas ??????
C'est le mime.ini qui me travaille.
yansolo 21/08/07
super job !!! mais j'ai mis 2 heures à comprendre qu'il fallait supprimer les espaces du fichier mime.ini
zaidammouna 26/03/08
comment peut on faire la connexion entre matlab et php?
outrement dit comment integrer uneapplication matlab dans un site web dynamique en php?
et mercie en avence (zix)!!!!!!!!!!!!!!!!!!!!
zaidammouna 26/03/08
s'il vous plait s'il n'existe pas de probléme donner mois un code en php pour la résolution de cette probléme (integrer une application matlab dans un site web dynamique en php)!!!!!!!!!!
zaidammouna 04/04/08
mon probleme c'est comment peut on faire la connexion entre matlab et php (comment integrer une application matlab dans un site web dynamique en php) ? s'il vous plait donner mois un code php qui fait la resolution de cette probleme et merci on avance
Ner0lph 12/11/08
Pour informations, FileInfo sera présent par défaut dans PHP 5.3.
Pour participer, il faut d'abord vous identifier !