petit probléme de controle de nom d'image en double

Eléphant du PHP | 388 Messages

16 mai 2010, 13:18

bonjour a tous su mon site la personne peut uploder une photo cependant j'ai placer je souhaiterai mettre un controle de nom de l'image.
car si l'image uploder porte déja le nom d'une des images l'image est remplacé.
Petit probléme quand meme comment puis-je proceder pour que dans mon script si admettons file exist alors un message apparaiterai merci de renommé la photo on sinon si possible que le nom se renomme automatiquement exemple toto.jpg cela metterai toto01.jpg ...
Merci pour votre aide voici mon script.
//dossier ou seront stocket les miniature et les images
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 90;

//recuperation du post du formulaire
if (isset($_POST['ok'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
			else {
			
			
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur 			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}

	
		else {
		

		
			if ($tableau[2] == 2) {
				
				if (is_file('.pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];
				

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille 				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {
// on crée une image à partir de notre grande image à l'aide de la librairie GD 					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$NouvelleLargeur = 120; //Largeur choisie à 350px mais modifiable
					$NouvelleHauteur = 100;
					$NouvelleLargeurpaysage = 120;
					$NouvelleHauteurpaysage = 100;
					
					
// on teste si notre image est de type paysage ou portrait 					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
						imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
						imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);

					}
 // on copie notre fichier généré dans le répertoire des miniatures 					
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				
			
				}
				
			include ('connect.php');			
			
                
                        $sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
                        $req = mysql_query($sql2)or die(mysql_error());
			
							$nom = "/{$_FILES['mon_image']['name']}";
							$image = $dir.$nom;
							$miniature = $dir_mini.$nom;
							$numannonce=mysql_insert_id();
							$sql3 = "INSERT INTO images (image,miniature,numannonce) VALUES ('$image','$miniature','$numannonce')";       
							$req = mysql_query($sql3)or die(mysql_error());

			  
			 header('Location: ../mesannonces.php');
			
			
			
									}
			else {
// si notre image n'est pas de type jpeg				
				unlink($_FILES['mon_image']['tmp_name']);
				$erreur = 'Votre image est d\'un format non supporté.';
			}
		}
	}

Eléphant du PHP | 428 Messages

16 mai 2010, 18:34

Salut,

En fait, je crois que le plus simple serait de générer un nom d'image différent pour chaque images uploadées.
Regarde du côté de rand();.

A+

ViPHP
AB
ViPHP | 5818 Messages

16 mai 2010, 21:04

On en parle aussi dans ce topic

Dans l'exemple je rajoute (suite à la demande initiale) un 'X' devant le nom de fichier mais tu pourrais tout aussi bien le rajouter à la fin (en changeant le code pour isoler l'extension), ou rajouter un indice numérique.

ViPHP
AB
ViPHP | 5818 Messages

16 mai 2010, 23:24

Un exemple pour incrémenter un nom de fichier si le fichier existe déjà (nécessite php 5.2 minimum)
function Rename_fich($adresse_fichier)

    {
      //Si le fichier existe et est un fichier valide
      if (is_file($adresse_fichier))
              {
                  // Informations sur le fichier
                  $info = pathinfo($adresse_fichier);
                  $extension = $info['extension'];
                  $filename = $info['filename'];
                  $dossier = $info['dirname'];
 
                  // Cherche dans le nom de fichier des caractères numériques en fin de nom et si oui incrémente ce nombre grâce à la fonction anonyme create_function
                  $filename = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $filename, '1', $count);
                                 
                  // Si des caractères numériques sont trouvés et incrémentés (le paramètre $count employé dans preg_replace_callback indique le nombre de remplacements), $filename prend sa nouvelle valeur, sinon l'ancienne concaténée à 1
                  $filename = !empty($count)? $filename : $filename.'1';
                                 
                  // Reconstruction du nom de fichier avec son extension (si elle existe)
                  $filename = !empty($extension) ? $filename.'.'.$extension : $filename;
                                 
                  // Reconstruction de l'adresse du fichier
                  $adresse = $dossier.'/'.$filename;
                                 
                  // Appel de la fonction pour re vérification avec le nouveau nom du fichier
                  return Rename_fich($adresse);
                                 
              }
                         
      // Retourne le chemin complet du fichier      
      else return $adresse_fichier;
    }
Modifié en dernier par AB le 24 mai 2010, 13:21, modifié 1 fois.

Eléphant du PHP | 388 Messages

24 mai 2010, 11:09

le probléme c'est que dans mon script je ne voit pas dutout comment la placer
//dossier ou seront stocket les miniature et les images
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 90;

//recuperation du post du formulaire
if (isset($_POST['ok'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
			else {
			
			
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur 			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}

	
		else {
		

		
			if ($tableau[2] == 2) {
function Rename_fich($dir,$mon_image)
{
   		
				if (is_file('.pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];
				

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille 				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {

// on crée une image à partir de notre grande image à l'aide de la librairie GD 					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					$NouvelleLargeur = 120; //Largeur choisie à 350px mais modifiable
					$NouvelleHauteur = 100;
					$NouvelleLargeurpaysage = 120;
					$NouvelleHauteurpaysage = 100;
					
					
// on teste si notre image est de type paysage ou portrait 					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
						imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
						imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);

					}
 // on copie notre fichier généré dans le répertoire des miniatures 										
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				
			
				}
}
				
			include ('connect.php');			
			$sql = "INSERT INTO utilisateurs (NOMUTILISATEURS,MAILUTILISATEURS,MDP,TELEPHONE) VALUES ('$NOMUTILISATEURS','$MAILUTILISATEURS','$crypt','$TELEPHONE')"; //Alors on insert dans la table le nouvel utilisateur        
                mysql_query ($sql);
                $NUMUTILISATEURS=mysql_insert_id();
                        $sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
                        $req = mysql_query($sql2)or die(mysql_error());
			
							$nom = "/{$_FILES['mon_image']['name']}";
							$image = $dir.$nom;
							$miniature = $dir_mini.$nom;
							$numannonce=mysql_insert_id();
							$sql3 = "INSERT INTO images (image,miniature,numannonce) VALUES ('$image','$miniature','$numannonce')";       
							$req = mysql_query($sql3)or die(mysql_error());

			  
			 Parse("resultat","merci $MAILUTILISATEURS, vous etes a present enregistre et votre annonce est enregistré");
			
			
			
									}
			else {
// si notre image n'est pas de type jpeg				
				unlink($_FILES['mon_image']['tmp_name']);
				$erreur = 'Votre image est d\'un format non supporté.';
			}
		}
	}
	
}
	}
	
	}
        else
        {
			//controle adresse email carractère
            header('Location: ../emailinvalide.php');
        }
    }
    else
    {
        //controle saisie champs
         header('Location: ../champsnonrenseigne.php');
    }




ViPHP
AB
ViPHP | 5818 Messages

24 mai 2010, 13:55

<?php
function Rename_fich($adresse_fichier)

    {
      //Si le fichier existe et est un fichier valide
      if (is_file($adresse_fichier))
              {
                  // Informations sur le fichier
                  $info = pathinfo($adresse_fichier);
                  $extension = $info['extension'];
                  $filename = $info['filename'];
                  $dossier = $info['dirname'];
 
                  // Cherche dans le nom de fichier des caractères numériques en fin de nom et si oui incrémente ce nombre grâce à la fonction anonyme create_function
                  $filename = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $filename, '1', $count);
                                 
                  // Si des caractères numériques sont trouvés et incrémentés (le paramètre $count employé dans preg_replace_callback indique le nombre de remplacements), $filename prend sa nouvelle valeur, sinon l'ancienne concaténée à 1
                  $filename = !empty($count)? $filename : $filename.'1';
                                 
                  // Reconstruction du nom de fichier avec son extension (si elle existe)
                  $filename = !empty($extension) ? $filename.'.'.$extension : $filename;
                                 
                  // Reconstruction de l'adresse du fichier
                  $adresse = $dossier.'/'.$filename;
                                 
                  // Appel de la fonction pour re vérification avec le nouveau nom du fichier
                  return Rename_fich($adresse);
                                 
              }
                         
      // Retourne le chemin complet du fichier      
      else return $adresse_fichier;
	}
	

//dossier ou seront stocket les miniature et les images
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 90;

//recuperation du post du formulaire
if (isset($_POST['ok'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
        if (empty($_FILES['mon_image']['tmp_name'])) {
               
                $erreur = 'Aucun fichier envoyé.';
        }
                        else {
                       
                       
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier            
                $tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
                if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur                   
                        unlink($_FILES['mon_image']['tmp_name']);
                        $erreur = 'Votre fichier n\'est pas une image.';
                }

       
                else {
               

               
                        if ($tableau[2] == 2) {
							
					$adresse = Rename_fich($dir.'/'.$_FILES['mon_image']['name']);
                       
                       			$file_upload = basename($adresse);
                               

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille                               
                                copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
                               
                                if ($tableau[2] == 2) {
// on crée une image à partir de notre grande image à l'aide de la librairie GD                                     
                                        $src = imagecreatefromjpeg($dir.'/'.$file_upload);
                                        $NouvelleLargeur = 120; //Largeur choisie à 350px mais modifiable
                                        $NouvelleHauteur = 100;
                                        $NouvelleLargeurpaysage = 120;
                                        $NouvelleHauteurpaysage = 100;
                                       
                                       
// on teste si notre image est de type paysage ou portrait                                     
                                        if ($tableau[0] > $tableau[1]) {
                                                $im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
                                                imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);
                                        }
                                        else {
                                                $im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
                                                imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);

                                        }
 // on copie notre fichier généré dans le répertoire des miniatures                                        
                                        imagejpeg ($im, $dir_mini.'/'.$file_upload);
                               
                       
                                }
                               
                        include ('connect.php');                       
                       
               
                        $sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
                        $req = mysql_query($sql2)or die(mysql_error());
                       
                                                       
                                                        $image = $dir.'/'.$file_upload;
                                                        $miniature = $dir_mini.'/'.$file_upload;
                                                        $numannonce=mysql_insert_id();
                                                        $sql3 = "INSERT INTO images (image,miniature,numannonce) VALUES ('$image','$miniature','$numannonce')";      
                                                        $req = mysql_query($sql3)or die(mysql_error());

                         
                         header('Location: ../mesannonces.php');
                       
                       
                       
                                                                        }
                        else {
// si notre image n'est pas de type jpeg                               
                                unlink($_FILES['mon_image']['tmp_name']);
                                $erreur = 'Votre image est d\'un format non supporté.';
                        }
                }
        }

Eléphanteau du PHP | 40 Messages

24 mai 2010, 15:45

Dans ce type de cas, je te conseil de remplacer le nom du fichier par sa signature md5 (voir la fonction hash_file) ce qui permet de gérer l'unicité des images de facon simple.

Seule les images existant déjà seront remplacée.
Des icones, des RFC

Eléphant du PHP | 388 Messages

24 mai 2010, 16:05

merci pour ta reponse donc j'ai adapter avec mon code cela me donne en erreur

Warning: Wrong parameter count for preg_replace_callback() in /aaa/aa/www/php/mcpvalidationannonceparticulier.php on line 40

voici le code total
<?php
session_start();
// tester la présence de la session numutilisateurs
if ( isset( $_SESSION['NUMUTILISATEURS']) ) {
// Recuperation pour la variable 
$NUMUTILISATEURS = $_SESSION['NUMUTILISATEURS'];


}
if (isset($_SESSION['MAILUTILISATEURS'])) {


 // traitement
$categorie=$_POST['categorie'];
$typeannonce=$_POST['typeannonce'];
$souscategorie=$_POST['souscategorie'];
$titreannonce=$_POST['titreannonce'];
$descriptionannonce=$_POST['descriptionannonce'];
$prix=$_POST['prix'];
$departement=$_POST['departement'];
$region=$_POST['region'];

include ('connect.php');
$crypt=md5($MDP);	


function Rename_fich($adresse_fichier)

    {
      //Si le fichier existe et est un fichier valide
      if (is_file($adresse_fichier))
              {
                  // Informations sur le fichier
                  $info = pathinfo($adresse_fichier);
                  $extension = $info['extension'];
                  $filename = $info['filename'];
                  $dossier = $info['dirname'];
 
                  // Cherche dans le nom de fichier des caractères numériques en fin de nom et si oui incrémente ce nombre grâce à la fonction anonyme create_function
                  $filename = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $filename, '1', $count);
                                 
                  // Si des caractères numériques sont trouvés et incrémentés (le paramètre $count employé dans preg_replace_callback indique le nombre de remplacements), $filename prend sa nouvelle valeur, sinon l'ancienne concaténée à 1
                  $filename = !empty($count)? $filename : $filename.'1';
                                 
                  // Reconstruction du nom de fichier avec son extension (si elle existe)
                  $filename = !empty($extension) ? $filename.'.'.$extension : $filename;
                                 
                  // Reconstruction de l'adresse du fichier
                  $adresse = $dossier.'/'.$filename;
                                 
                  // Appel de la fonction pour re vérification avec le nouveau nom du fichier
                  return Rename_fich($adresse);
                                 
              }
                         
      // Retourne le chemin complet du fichier      
      else return $adresse_fichier;
        }
       

//dossier ou seront stocket les miniature et les images
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 90;

//recuperation du post du formulaire
if (isset($_POST['ok'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
        if (empty($_FILES['mon_image']['tmp_name'])) {
               
                $erreur = 'Aucun fichier envoyé.';
        }
                        else {
                       
                       
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier            
                $tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
                if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur                  
                        unlink($_FILES['mon_image']['tmp_name']);
                        $erreur = 'Votre fichier n\'est pas une image.';
                }

       
                else {
               

               
                        if ($tableau[2] == 2) {
                                                       
                                        $adresse = Rename_fich($dir.'/'.$_FILES['mon_image']['name']);
                       
                                        $file_upload = basename($adresse);
                               

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille                              
                                copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
                               
                                if ($tableau[2] == 2) {
// on crée une image à partir de notre grande image à l'aide de la librairie GD                                    
                                        $src = imagecreatefromjpeg($dir.'/'.$file_upload);
                                        $NouvelleLargeur = 120; //Largeur choisie à 350px mais modifiable
                                        $NouvelleHauteur = 100;
                                        $NouvelleLargeurpaysage = 120;
                                        $NouvelleHauteurpaysage = 100;
                                       
                                       
// on teste si notre image est de type paysage ou portrait                                    
                                        if ($tableau[0] > $tableau[1]) {
                                                $im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
                                                imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);
                                        }
                                        else {
                                                $im = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
                                                imagecopyresampled($im , $src  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $tableau[0],$tableau[1]);

                                        }
 // on copie notre fichier généré dans le répertoire des miniatures                                        
                                        imagejpeg ($im, $dir_mini.'/'.$file_upload);
                               
                       
                                }
                               
                        include ('connect.php');                      
                       
               
                        $sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
                        $req = mysql_query($sql2)or die(mysql_error());
                       
                                                       
                                                        $image = $dir.'/'.$file_upload;
                                                        $miniature = $dir_mini.'/'.$file_upload;
                                                        $numannonce=mysql_insert_id();
                                                        $sql3 = "INSERT INTO images (image,miniature,numannonce) VALUES ('$image','$miniature','$numannonce')";      
                                                        $req = mysql_query($sql3)or die(mysql_error());

                         
                         header('Location: ../mesannonces.php');
                       
                       
                       
                                                                        }
                        else {
// si notre image n'est pas de type jpeg                              
                                unlink($_FILES['mon_image']['tmp_name']);
                                $erreur = 'Votre image est d\'un format non supporté.';
                        }
                }
        }
}		
} else {
        echo '<br>Vous n\'avez pas les droits pour regarder cette page...<br><br>';
        echo '<a href="index.php">Retour</a>';
}

?>

ViPHP
ViPHP | 5462 Messages

24 mai 2010, 16:19

merci pour ta reponse donc j'ai adapter avec mon code cela me donne en erreur

Warning: Wrong parameter count for preg_replace_callback() in /aaa/aa/www/php/mcpvalidationannonceparticulier.php on line 40
t'as quelle version de php ?

ViPHP
AB
ViPHP | 5818 Messages

24 mai 2010, 16:22

Ah bah c'est que tu dois avoir une version de php < à 5.1

En plus comme pathinfo_filename utilisé dans cette même fonction n'est compatible qu'à partir de php 5.2 ... y'a un peu de boulot pour convertir tout ça pour les anciennes versions de php.

Heu tu as quelle version de php ?

Eléphant du PHP | 388 Messages

24 mai 2010, 16:24

c'est trés mal renseigné sur mon hébergeur version sql : 5.0.51a
et je pence que version php c'est marqué Version du serveur: 5.0.90

ViPHP
ViPHP | 5462 Messages

24 mai 2010, 16:28

c'est trés mal renseigné sur mon hébergeur version sql : 5.0.51a
et je pence que version php c'est marqué Version du serveur: 5.0.90
humm je pense pas, fais un
echo phpversion();

Eléphant du PHP | 388 Messages

24 mai 2010, 16:44

la version est 4.4.9

ViPHP
ViPHP | 5462 Messages

24 mai 2010, 16:45

la version est 4.4.9
t'es chez quelle hébergeur ?

Eléphant du PHP | 388 Messages

24 mai 2010, 16:51

je suis chez ovh