Renommer un fichier existant

Eléphant du PHP | 216 Messages

28 avr. 2010, 16:48

Bonjour,

j'ai un script d'upload de fichier et voici la partie qui renomme le fichier s'il existe

 
			if (is_file($dest_dossier .$_FILES['up_photo']['name']))
				{
						// echo 'dest_fichier = '.$dest_fichier;
					$dest_fichier = 'X'.$_FILES['up_photo']['name']; 
					 	// echo 'dest_fichier = '.$dest_fichier;
				}
 
 

Le souci, c'est qaund mon fichier 'lambda.jpeg' est renommé en 'Xlambda.jpeg',

au moment d'un nouveau load de photo, le fichier 'Xlambda.jpeg' le fichier n'est pas renommé en "XXlambda.jpeg"...

Merci d'avance pour votre aide.
Modifié en dernier par sam01 le 10 mai 2010, 12:41, modifié 2 fois.

ViPHP
ViPHP | 5462 Messages

28 avr. 2010, 17:00

normal puisque tu va uniquement chercher lambda.jpeg, nul part tu lui dis d'allé voir dans le dossier si xlamba.jpeg existe
je te conseil d'utiliser une date plutôt

ViPHP
AB
ViPHP | 5818 Messages

28 avr. 2010, 20:05

Si tu tiens à ta méthode tu peux faire une petite fonction récursive :
function rename_fich($dossier,$fichier)
{
      if (is_file($dossier.$fichier))
              {
                  $fichier = 'X'.$fichier;
                  return rename_fich($dossier,$fichier);
              }
      else return $dossier.$fichier;

}

$destination = rename_fich($dossier,$_FILES['up_photo']['name']);

Modifié en dernier par AB le 16 mai 2010, 20:50, modifié 1 fois.

Eléphant du PHP | 216 Messages

29 avr. 2010, 20:45

C'est ça que je recherchais.

Merci beaucoup.

ViPHP
AB
ViPHP | 5818 Messages

29 avr. 2010, 21:14

C'est ça que je recherchais.

Merci beaucoup.
Alors un petit résolu ?

Eléphant du PHP | 216 Messages

10 mai 2010, 12:43

Bonjour à tous,

j'ai l'impression que ça ne fonctionne pas car dès qu'un fichier porte le même nom, il est écrasé..., il n'est pas renommé....

  
function rename_fich($dest_dossier,$dest_fichier)
{
      if (is_file($dest_dossier.$dest_fichier))
              {
                  $dest_fichier = 'X'.$dest_fichier;
                  rename_fich($dest_dossier,$dest_fichier);
              }
      else return $dest_dossier.$dest_fichier;

}


if (is_file($dest_dossier .$_FILES['up_photo']['name'])){
					$dest_fichier = rename_fich($dest_dossier,$_FILES['up_photo']['name']);}


ViPHP
AB
ViPHP | 5818 Messages

10 mai 2010, 18:41

Et comment tu définis $dest_dossier, c'est égal à quoi dans ton code ?

ViPHP
AB
ViPHP | 5818 Messages

16 mai 2010, 20:57

J'avais oublié un return dans la fonction. Pour rajouter un X devant chaque nom de fichier existant c'est donc :
function rename_fich($dossier,$fichier)
{
      if (is_file($dossier.$fichier))
              {
                  $fichier = 'X'.$fichier;
                  return rename_fich($dossier,$fichier);
              }
      else return $dossier.$fichier;

}
$destination = rename_fich($dossier,$_FILES['up_photo']['name']);

Eléphant du PHP | 216 Messages

17 mai 2010, 17:00

Bonjour,

dest_dossier est défini de la façon suivante : $dest_dossier = 'E:\EasyPHP1-8\www\images\photo\\'.$_SESSION['id_adh'].'\\';

Par contre la fonction ne marche qu'une seule fois...

En plus au lieu de renommer le fichier 1gd.jpg en X1gd.jpg, il est renommé en : E_EasyPHP1_8_www_images_photo_4_X1gd.jpeg

Il est préfixé par le nom du répertoire et avec un X.

Et quand veux recharger un fichier 1gd.jpg (donc du même nom), ça ne fonctionne plus la deuxième fois.

En gros ça ne marche qu'une fois, et avec un nom à rallonge...

ViPHP
AB
ViPHP | 5818 Messages

17 mai 2010, 22:15

Un exemple complet :
<?php
header('Content-type: text/html; charset=UTF-8');


// Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ;  si fichier1.ext existe, renomme en fichier2.ext etc..
function Rename_fich($dossier,$fichier)
{
      //Si le fichier existe et est un fichier valide
      if (is_file($dossier.$fichier))
              {
		  // Informations sur le fichier
		  $info = pathinfo($dossier.$fichier);
		  $extension = $info['extension'];
		  $filename = $info['filename'];
				  
		  // Cherche dans le nom de fichier des caractères numériques en fin de nom
		  $num = preg_match('#[0-9]+$#',$filename,$matches)? $matches[0] : null;
				
		  // Si des caractères numériques sont trouvés, incrémente la valeur de +1 sinon concatène 1 au nom du fichier
		  $filename = isset($num)? substr($filename,0,- strlen($matches[0])).($matches[0]+1) :$filename.'1';
				  
		  // Reconstruction du nom de fichier avec son extension (si elle existe)
                  $fichier = !empty($extension) ? $filename.'.'.$extension : $filename;
				 
		  // Appel de la fonction pour re vérification avec le nouveau nom du fichier 
                  return Rename_fich($dossier,$fichier);
				 
              }
			  
      // Retourne le chemin complet (adresse répertoire + nom de fichier)	  
      else return $dossier.$fichier;
}



$message = null;

// Téléchargement du fichier vers le serveur
if (!empty($_POST['chargement']) && isset($_FILES['userfile']['tmp_name'],$_FILES['userfile']['name']))
	{
		
		// Nom du fichier téléchargé
		$localfile = $_FILES['userfile']['name'];
		
		// Extensions de fichier autorisées
		$extensions_ok = array('png','jpg','jpeg','gif','pdf','txt');
		
		// Trouve l'extension du fichier et la met en minuscules
		$extension = strtolower(substr($localfile,strrpos($localfile, ".")+1)); 
		
		// Si l'extension est contenue dans le tableau des extensions autorisées, on continue le script	
		if (in_array($extension,$extensions_ok))
		
			{ 
			
				// Nettoyage des caractères accentués ou non valides
				$nom_fichier = iconv('UTF-8', 'ASCII//TRANSLIT', $localfile);
				$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
				  
				// Adresse du serveur 
				$adresse = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
				
				// Répertoire de destination
				$repertoire = 'PHOTO/';
				
				// Adresse du répertoire de destination 
				$destination = $adresse.$repertoire;
				
				// Vérification de l'existence du fichier dans le répertoire et si besoin renommage du fichier
				$destination = Rename_fich($destination,$nom_fichier);
				 
				// Nom du fichier final
				$nom_fichier = basename($destination);
				 
				// Chargement du fichier - avec le nom temporaire créé par le serveur - vers l'adresse de destination
				if(@move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))
																									
					{
						// Préparation des messages de confirmation
						$resultat1 = 'Le fichier "'.$localfile.'" a été téléchargé sur le serveur';
						$resultat2 = 'Le fichier "'.$localfile.'" renommé "'.$nom_fichier.'" a été téléchargé sur le serveur';
						// Création du message de confirmation
						$message = $localfile == $nom_fichier ?  $resultat1 : $resultat2;
					}
					
					else 
					{
						// Message d'erreur de téléchargement
						$message = 'Problème de téléchargement';
					}
			}
			
			else 
			
			{
				//Transforme le tableau en chaine de caractères séparés par une virgule suivie d'un espace (pour affichage dans le message d'erreur)
				$extensions_autorisees = implode(', ',$extensions_ok);
				
				// Message d'erreur d'extension du fichier
				$message = 'Extension du fichier non autorisée. Extensions autorisées : '.$extensions_autorisees.'.';		
			}
		
	}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Exemple téléchargement avec renommage des fichiers si déjà existants</title>
</head>

<body>
	<div><?php if (isset($message)) echo  $message;?></div>
		
	<form enctype="multipart/form-data" action="#" method="post">
	<p>
	<input type="hidden" name="chargement" value="1" />
	<input name="userfile" type="file" size="70" />
	<input type="submit" value="Envoyez"  style="margin-left:5px" />
	</p>
	</form>
        <p>Taille maximum autorisée = <?php echo ini_get('upload_max_filesize').'o'?></p>
		
</body>
</html>
En phase de développement, vous pouvez supprimer le '@' devant "move_uploaded_file" pour afficher plus d'information concernant les erreurs. Il est prudent de le remettre en phase d'exploitation.