Page 1 sur 1

Type mime d'un fichier

Posté : 14 déc. 2008, 19:31
par BaLiSTiK
Bjr,
Je suis en train de créer une page permettant aux utilisateurs de mon site de pouvoir changer leur avatar. Avant de pouvoir autoriser leur nouvel avatar, je souhaite vérifier le type MIME de l'image et non l'extension. Mon probleme est que la fonction
mime_content_type()
est obsolète. Donc laquelle faut-il utiliser ?

Voila mon code pour les intéressés :
Apres le submit sur le formulaire auquel l utilisateur proposer un lien d'une image (le cas d'upload d avatar n est pas encore pris en compte)
if(!empty($_POST['modifAvatar'])){
	$this->avatar = $this->verifTypeImage($_POST['modifAvatar']);
	if(!$this->avatar){ 
	         $this->m_bMessage = '<p style="color:#ff0000">L\'image n\'a pas le bon format. Seuls les formats jpg, gif ou png sont autoris&eacute;s.</p>';
	}else if($this->avatar){
		$this->m_bMessage = '<p style="color:#ff0000">L\'image est au bon format</p>';
	}
}//fin if empty avatar

public function verifTypeImage($link){
		
	$link = '\''.$link.'\'';
	$fmt = array("image/jpg","image/gif","image/png"); //Liste des types mime autorisé
	$typeMAv = mime_content_type($link); //retourne le type mime d un fichier
	if(in_array($typeMAv,$fmt)){
		return true;
	}else{
		return false;
	}
}//fin fonction verification du type mime
Merci d'avance :)

Posté : 14 déc. 2008, 21:14
par patbator
Hello,

http://fr.php.net/manual/fr/function.getimagesize.php

retourne aussi le type mime si le fichier est une image et false sinon (avec lancement d'un warning) ;)

Posté : 14 déc. 2008, 22:10
par BaLiSTiK
Merci,
j ai donc transformé ma fonction en conséquence :
	
	public function verifTypeImage($link){
		
		$urlImg = '"'.$link.'"';
		$fmt = array("image/jpg","image/gif","image/png","image/jpeg"); //Liste des types mime autorisés
		list($width, $height, $type, $attr, $bits,$channels,$mime) = getimagesize($urlImg); //retourne la taille, la hauteur et le type mime d un fichier
		if(in_array($mime,$fmt)){
			return true;
		}else{
			return false;
		}
	}//fin fonction verification du type mim
Si j'envoie une URL (j ai pris format png), j ai ce message :
Warning: getimagesize("http://www.cldmirabel.qc.ca/documents/LOGOCLD_PNG24.png") [function.getimagesize]: failed to open stream: No such file or directory in /home.45/f/o/n/fonfonla/www/user.class.php on line 210
Si je comprends bien, il arrive pas à déterminer l url de l image ?

Posté : 14 déc. 2008, 22:59
par AB
Il faut appliquer getimagesize() sur le fichier temporaire téléchargé car cette fonction ne marche pas sur les fichiers distants
un exemple http://www.phpfrance.com/forums/voir_su ... -asc-0.php

Posté : 15 déc. 2008, 00:27
par BaLiSTiK
Merci pour le code, je m en suis inspiré, mais ça bug toujours encore un peu ^^.
Voila le code de upload de l avatar :
$oUser->_verifieModifUser();
echo $oUser->m_bMessage;
		
switch($idChoix)
[...]
case 5 :
	echo '<p>Modification de l\'avatar (Formats support&eacute;s : JPG, GIF,PNG)</p>';
	$inputAv = '<form enctype="multipart/form-data" method="post">';
	$inputAv .= '<p><input type="hidden" name="MAX_FILE_SIZE" value="100000" />';
	$inputAv .= 'Envoie de l\'image : <input name="modifAvatar" type="file" style="border:#999999 1px solid;" />';

	$inputAv .= '&nbsp;<input type="submit" name="btnModifier" value="Modifier" style="border:1px solid #999999;" /></p>';
        $inputAv .= '</form>';
        echo $inputAv;
        break;
}
Je recupere le fichier ds la méthode _verifieModifUser() qui va permettre de modifier plusieurs donnés d'un utilisateur, l avatar dans le cas qui nous interesse.
[...] -> bout de code traitant d'autres choses
public function _verifieModifUser(){
	if(isset($_POST['btnModifier']) && !empty($_POST['btnModifier'])){
		[...]
		if(empty($_FILES['modifAvatar']['name']))	$this->m_bMessage = '<p style="color:#ff0000">Veuillez choisir un avatar svp.</p>';
               [...]
               if(!empty($_FILES['modifAvatar']['name'])){
			
			$avatar = 'images/avatar/'.basename($_FILES['modifAvatar']['name']);
			//remplacement des caracteres speciaux
			$avatar = strtr($avatar, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
                       // remplacer les caracteres autres que lettres, chiffres et point par _
                       $avatar = preg_replace('/([^.a-z0-9]+)/i', '_', $avatar);

			if (move_uploaded_file($_FILES['modifAvatar']['tmp_name'], $avatar)) {
				$this->avatar = $this->verifTypeImage();
				if($this->avatar){
					$this->_modifAvatar($avatar); //Fonction qui ecrira l url de l avatar ds la table utilisateur
				}
			}else{
				$this->m_bMessage = '<p style="color:#ff0000">L\'image n\'a pas &eacute;t&eacute; upload&eacute;e.</p>';
		         }
		}//fin if empty avatar
        }//fin if isset
}//fin methode

//Fonction qui va verifier si la vatar up est correct, sic est le cas, il créé l avatar
public function verifTypeImage($avatar){
		
	//Hauteur et longueur max autorise
	$width_auth = 100;
	$height_auth = 100;
		
	//Liste des types mime autorisés
	$fmt = array("image/jpg","image/gif","image/png","image/jpeg");
	//Verification de l image temporaire uploadé
	$size = getimagesize($avatar); 
	//recuperation des infos de getimagesize
	list($width,$height,$ext,$attr,$bits,$channels,$mime) = $size;
	//si le mime ne se trouve pas ds le tableau des mime authorisé : on retourne faux
	if(!in_array($mime,$fmt)){
		echo $this->m_bMessage = '<p>Le format de ce fichier n\'est pas autoris&eacute;. Seuls les formats gif, png et jpg sont autoris&eacute;s</p>';
		$ac = false;
	}else if($width >= $width_auth && $height >= $height_auth){
		echo $this->m_bMessage = '<p>La taille du fichier d&eacute;passe la taille autoris&eacute;</p>';
		$ac = false;
		//On va verifier les dimmensions
		
	}else if(in_array($mime,$fmt) && $width < $width_auth && $height < $height_auth){
		switch($ext){
			 case 1: // GIF
                	$source = imagecreatefromgif($_FILES['modifAvatar']['tmp_name']); // L'image est la source
                    break;
                    
		case 2: //JPEG
                    $source = imagecreatefromjpeg($_FILES['modifAvatar']['tmp_name']); // L'image est la source
                    break;
                
		case 3: // PNG
                     $source = imagecreatefrompng($_FILES['modifAvatar']['tmp_name']); // L'image est la source
                     break;
			}//fin switch
			
		echo $this->m_bMessage = '<p>L\'image '.$_FILES['modifAvatar']['name']. ' a &eacute;t&eacute; transf&eacute;r&eacute;e avec succ&egrave;s</p>'; 
		$av = true;
	}
	return $av;
}//fin fonction verification du type mime
J ai tenté de up un .gif et ensuite un .jpg :
Le format de ce fichier n'est pas autorisé. Seuls les formats gif, png et jpg sont autorisés
Le format de ce fichier n'est pas autorisé. Seuls les formats gif, png et jpg sont autorisés
voila ^^

Posté : 15 déc. 2008, 01:17
par AB
$this->avatar = $this->verifTypeImage();
Tu n'aurais pas oublié de passer un argument dans ta fonction ?

Et puis il faut trouver le chemin réel de ton dossier pour utiliser move_uploaded_file() alors que 'images/avatar...' est un chemin relatif.

Si ton dossier images est à la racine de ton site, pour avoir son adresse complète tu peux faire :
$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;

$chem_dossier_images = $real.'images/';

Posté : 16 déc. 2008, 17:33
par BaLiSTiK
J ai finalement réussi :). Merci pour l'aide ^^. Voila le code :
Code de verification de l image :
if(!empty($_FILES['modifAvatar']['name'])){
			
	$avatarTmp = basename($_FILES['modifAvatar']['name']);
	//remplacement des caracteres speciaux
	$avatarTmp = strtr($avatarTmp, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
        // remplacer les caracteres autres que lettres, chiffres et point par _
        $avatarTmp = preg_replace('/([^.a-z0-9]+)/i', '_', $avatarTmp);
	//$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ; 
	$real = (substr($_SERVER['SERVER_NAME'],-1) == '/')? $_SERVER['SERVER_NAME'] : $_SERVER['SERVER_NAME'].'/' ; 
	$avatarTmp = /*'http://'.$real.'~fonfonla/*/ 'images/avatar/tmp/'.$avatarTmp;
	//On va verifier l avatar temporaire
	$this->avatar = $this->verifTypeImage($_FILES['modifAvatar']['tmp_name'],$avatarTmp);
	if(!$this->avatar){
		$this->m_bMessage .= '<p style="color:#ff0000;">Veuillez recommencer svp.</p>';
	}else if($this->avatar){
		//$this->_modifURLAvatar();
		$this->m_bMessage .= '<br /><br /><p>Effacement de l\'ancien avatar <br /><img src="'.$this->m_aInfoUser['avatar'].'" alt="old_av" /></p>';
		unlink($this->m_aInfoUser['avatar']);
	}
}//fin if empty modifAvatar
Le methode de verification du bon format :
	//Fonction qui va verifier si la vatar up est correct, sic est le cas, il créé l avatar
	public function verifTypeImage($tmp,$avatar){

		//Hauteur et longueur max autorise
		$width_auth = 200;
		$height_auth = 200;		
		if(move_uploaded_file($tmp, $avatar)){

			//Liste des types mime autorisés
			$fmt = array("image/jpg","image/gif","image/png","image/jpeg");
			//Verification de l image temporaire uploadé
			$size = getimagesize($avatar); 
			//recuperation des infos de getimagesize
			list($width,$height,$type,$attr) = $size;
			
			//recuperation du type mime
			$mime = image_type_to_mime_type(exif_imagetype($avatar));
			//echo $this->m_bMessage = '<p>Type mime de &avatar : '.$mime.'<br />Width : '.$width.'<br />Hauteur : '.$height.'</p>';
			//si le mime ne se trouve pas ds le tableau des mime authorisé : on retourne faux
			if(!in_array($mime,$fmt)){
				$this->m_bMessage = '<p style="color:#ff0000;">Le format de ce fichier n\'est pas autoris&eacute;. Seuls les formats gif, png et jpg sont autoris&eacute;s. </p>';
				unlink($avatar);
				$ac = false;
			}else if($width > $width_auth && $height > $height_auth){
				$this->m_bMessage = '<p style="color:#ff0000;">La taille du fichier d&eacute;passe la taille autoris&eacute; qui est de '.$width_auth.'x'.$height_auth.'. Votre avatar est de '.$width.'x'.$height.'.</p>';
				unlink($avatar);
				$ac = false;
				//On va verifier les dimmension
			}else if(in_array($mime,$fmt) && $width < $width_auth && $height < $height_auth){
				$ext = array("1" => "GIF","2" => "JPEG", "3" => "PNG");
				copy($avatar,'images/avatar/'.$_FILES['modifAvatar']['name'].'');
				$avatarNew = 'images/avatar/'.$_FILES['modifAvatar']['name'];		
				$this->m_bMessage = '<p>Votre avatar est de type mime '.$mime.'<br />Longueur : '.$width.'<br />Hauteur : '.$height;
				$this->m_bMessage .= '<br />Extension de l\'avatar : '.$ext[$type].'</p>';
				$this->m_bMessage .= '<p>Effacement du fichier temporaire '.$avatar.'</p>';
				unlink($avatar);
				//unlink($_FILES['modifAvatar']['tmp_name']);
				$this->m_bMessage .= '<p>L\'image '.$avatarNew. ' a &eacute;t&eacute; transf&eacute;r&eacute;e avec succ&egrave;s</p>'; 
				$this->m_bMessage .= '<p align="center"><img src="'.$avatarNew.'" alt="avatar" /></p>';
				$this->_modifURLAvatar($avatarNew);
				$av = true;
			}
		}//fin if moved_upload file
		else{
			$this->m_bMessage = '<p style="color:#ff0000;">Le fichier n\'a pas pu &ecirc;tre upload&eacute;.</p>';
		}
		return $av;
	}//fin fonction verification du type mime

Posté : 16 déc. 2008, 17:41
par AB
Si tu code en UTF-8 tu auras des pb pour le remplacement des caractères accentués. Utilises str_replace() et non pas strtr()

Posté : 16 déc. 2008, 18:29
par BaLiSTiK
Si tu code en UTF-8 tu auras des pb pour le remplacement des caractères accentués. Utilises str_replace() et non pas strtr()
J'utilise plutot le ISO-8859-1 pour l'encodage, est ce que je dois quand même utiliser le str_replace() ?