Page 1 sur 1

renommer un fichier en upload !

Posté : 15 oct. 2005, 18:48
par gesualda
bonjour

J'ai adapter le script de "Webdeb73" pour l'upload de fichier sur le serveur. Par contre, ce script ne controle pas si le fichier est existant.

J'aimerai faire que s'il est existant il soit renommer.

Es ce possible en php ?
bout du script:
elseif($_FILES['fichier']['name']){
	
$target     = "files/";  // Repertoire cible
$max_size   = 210000;     // Taille max en octets du fichier
$extensions_ok = array(".doc",".txt",".pdf",".zip",".rar");
$nom_file   = $_FILES['fichier']['name'];
$taille     = $_FILES['fichier']['size'];
$tmp        = $_FILES['fichier']['tmp_name'];
$chemin     = $target.$_FILES['fichier']['name'];
$extension = substr(strrchr($nom_file, "."), 0); // Récupération de l'extension
	 // On vérifie l'extension du fichier
    if(in_array(strtolower($extension),$extensions_ok))    {
       // On récupère les dimensions du fichier
        $infos_img = getimagesize($_FILES['fichier']['tmp_name']);         
			// vérification de la taille de l'image ou du zip
			if($taille <= $max_size)        {		   
		   // Si c'est OK, on teste l'upload
            if(move_uploaded_file($tmp,$chemin))						{
              // Si upload OK alors on affiche le message de réussite             
                echo '<strong>Fichier :</strong> '.$_FILES['fichier']['name'].'<br />';
                echo '<strong>Taille :</strong> '.$_FILES['fichier']['size'].' Octets<br />';            			
            }			
          else
            {
               // Sinon on affiche une erreur système                
                echo "<span>Erreur lors de l'upload !</span>";              
            }
        }
          else
        {
          // Sinon erreur sur le poid de la photo           
            echo "<span>Le poids du fichier est supérieur à 200 ko, veuillez le réduire svp, merci !</span>";            
        }
    }			         
	      else
    {
      // Sinon on affiche une erreur pour l'extension       
        echo "<span>Votre document doit avoir l'extention suivantes: .doc - .txt - .pdf - .zip - .rar </span>"; 								
									        
    }
   }
Merci de votre aide et de vos explications. :oops:

Posté : 15 oct. 2005, 18:49
par Cyrano
Alors vérifie l'existence du fichier avec file_exists() et selon la réponse, renomme ton nouveau fichier ou non.

Posté : 15 oct. 2005, 19:09
par gesualda
Salut Cyrano,

Merci de la réponse. j'ai donc consulté la doc, mais je suis confronter à un autre problème
Tout d'abord, la syntaxe est-elle correct ?
 if(file_exists($tmp){
		rename($tmp , "files/mon_fichier_2.doc");
		}
Mon problème se situe, je pense dans le nom de fichier, puisque j'aimerai renommer le fichier par exemple si le fichier s'appelle
- "mon_fichier_1.doc"
en
- "mon_fichier_2.doc"

et en lui gardant l'extension d'origine, cela est t-il possible à savoir que j'autorise plusieurs extensions ?

Posté : 15 oct. 2005, 19:49
par Cyrano
Non, rename() suppose que le fichier a déjà été enregistré à sa place... et donc que tu as écrasé celui qui portait le même nom: il faut faire ton renommage AVANT l'enregsitrement du répertoire temporaire vers le répertoire définitif.

Donc la solution consiste à le télécharger dans un répertoire temporaire que tu auras défini toi-m-ême, à le renommer cette fois-ci avec rename() et ensuite le déplacer à nouveau vers le répertoire définitif.

Posté : 15 oct. 2005, 21:44
par gesualda
Désolé Cyrano, avec la meilleure des volontés j'ai bien cherché un peu partour allez voir la doc officiel, mais c'est pas évident pour moi.

Je commence donc par le début.

j'ai fait ca pour voir si le fichier existe:
if(file_exists($chemin, $nom_file)) {
echo "<p>le fichier existe deja dans le repertoire</p>";  
}
ce qui avait pour effet de me donner cette erreur:

Warning: Wrong parameter count for file_exists()

En fait je vais etre franc, je plus vraiment par ou il faut commencer.

:oops: :oops:

Posté : 15 oct. 2005, 21:54
par Cyrano
BOn, on va essayer de schématiser: il te faut un répertoire temporaire où stocker au besoin un fichier que tu veux uploader: Lors de l'upload, tu récupères le nom, ensuite, tu vérifies si un fichier de ce nom existe déjà dans le répertoire normal.
- Si ce n'est pas le cas, tu poursuis l'upload normal;
- Sinon, tu modifie le chemin de destination du fichier pour l'uploader temporairement dailleurs, dans le répertoire temporaire mentionné plus haut. Tu renommes ensuite le fichier et tu le déplace dans le répertoire normal prévu à l'origine.

Pour utiliser file_exists, il faut concatérer le chemin et le nom du fichier: tu envois un paramètre de trop avec une virgule parce que a virgule signale qu'il y a un second paramètre, donc:
if(file_exists($chemin.$nom_file))
{
    echo "<p>le fichier existe deja dans le repertoire</p>";  
}

Posté : 15 oct. 2005, 22:15
par gesualda
Merci de la réponse. je vais continuer et je pense que ca va etre ma tasse à boire pour les heures à venir. et j'ai vu que tu m'explique par l'exemple et je vais essayé.

J'ai trouvé ce tuto sur php france qui recalle un peu mes recherches.

Posté : 16 oct. 2005, 20:03
par gesualda
J'ai continué à chercher, j'ai vu le tuto en place ici
C'est vraiment très instructif et franchement très clair.

Cyrano, j'ai donc mis en place ta suggestion pour le controle de l'existence, mais par contre je vois pas trop comment procéder en cas d'existence d'un meme fichier, pour que celui ci soit renommer surtout quel nom de renommage affecter tout en gardant la meme extension.

Désolé, je cherche, mais je me butte encore sur ce problème .. :oops:

Posté : 16 oct. 2005, 20:08
par Cyrano
Toujours schématiquement:

Code : Tout sélectionner

Si (le fichier existe déjà sous ce nom) { Alors déplacement du fichier vers un répertoire temporaire (move_uploaded_file();) Renommage du fichier; Déplacement du fichier vers répertoire définitif(move_uploaded_file();); } Sinon { Déplacement vers répertoire définitif direct (move_uploaded_file();) }
Est-ce que ce principe ne te semble pas logique ?

Posté : 16 oct. 2005, 20:14
par gesualda
Merci Cyrano, en fait je m'explique mal, ca je suis d'accord et je pense avoir saisi, mais en fait mon problème c'est plutot avec la fonction rename() qui me pose problème.

je fait bien
rename($monfichier_actuel,$monnouveaunomdefichier) 
Mais soucis est comment renommer ce nouveau nom ? par quel procéder lui attribuer un nom ? :oops:

Posté : 16 oct. 2005, 20:31
par Cyrano
Rajoute un numéro : fais une petite boucle de vérification et concatène un numéro au fichier.
<?php
//... On commence par isoler le nom de son extension
$fichier = explode(".", $mon_fichier);
// On récupère le nom:
$nom_fichier = $fichier[0];
$ext = $fichier[1];
// on crée un pointeur :
$i = 1;
// On va partir du principe qu'on aura jamais plus de 20 fichiers du même nom
for($i = 1; $i <= 20; $i++)
{
    //On fait une concaténation et on vérifie si cette combinaison est disponible
    if(!file_exists($nom_fichier.$i.".".$ext))
    {
        // Le nom est disponible, on l'affecte à notre nouvelle variable
        $nouveau_fichier = $nom_fichier.$i.".".$ext;
        // On peut quitter la boucle
        break;
    }
    // Arrivé ici (else), la condition n'est pas bonne, le nouveau nom est utilisé, on reboucle
}
// On a maintenant un nom unique à attribuer avec $nouveau_ficher.
?>

Posté : 16 oct. 2005, 20:46
par gesualda
Merci

Je vais essayer de mettre cela en forme, et je reviendrai pour dire si j'y arrivé, mais là il faut que je repose, un peu mes neurones.

Je voudrais profiter pour remercier Cyrano, Truc et tous les autres bénévoles pour leurs aides et leurs patiences qu'ils apportent à nous autres les débutants et pour ce forum absolument passionnant.

Merci :D

Posté : 16 oct. 2005, 20:55
par Truc
Je voudrais profiter pour remercier Cyrano, Truc et tous les autres bénévoles
Yep, je suis meme pas intervenu dans ce thread et je suis remercié \:D/

De rien gesualda ensemble nous vaincrons :langue:

Posté : 16 oct. 2005, 22:57
par Cyrano
Yep, je suis meme pas intervenu dans ce thread et je suis remercié \:D/
Ça compense pour les autres qui ne l'ont pas fait alors que justement tu avais participé :langue: