Changer le nom d'un fichier uploadé

Eléphant du PHP | 169 Messages

22 févr. 2007, 19:01

Slt,

voici le code que j'ai :
<?php
// UPLOAD DE FICHIER

/*
****************************************************************
*                VERIFICATION AVANT UPLOAD                     *
****************************************************************
*/

if(isset($_FILES['PDF'])) // si la variable PDF existe
{
	// paramettre
	unset($erreur);                         // Detruire la variable $erreur (ne pas affiché la variable)
	$extensions_ok = array('pdf');          // Autorisé juste les fichiers PDF
	$taille_max = 4194304;                   // avec un poid MAXIMUM de 4Mo (1Mo = 1000000)
	$dest_dossier = 'PDF_programme/';       // Chemin du dossier qui vas recevoir les PDF... utilisez également des slashes sous windows : $dest_dossier = 'd:/damien/photos/';
	
		// vérifications
		if( !in_array( substr(strrchr($_FILES['PDF']['name'], '.'), 1), $extensions_ok ) )
			{
			$erreur = 'Seul les fichiers au <strong>format PDF<strong/> sont accepté, veuillez recommencer !';
			}
			
		elseif( file_exists($_FILES['PDF']['tmp_name'])and filesize($_FILES['PDF']['tmp_name']) > $taille_max)
			{
			$erreur = 'Le fichier ne doit pas dépasser <strong>4 Méga</strong>, si vous souhaitez le réduire contacté "Stephane" !';
			}
	
	
	
	
/*
****************************************************************
*                    ENVOIE DU FICHIER                         *
****************************************************************
*/
		
		// si la variable ERREUR n'existe pas
		if(!isset($erreur))                                      
			{
			// formatage du nom du fichier / Sépare le nom du fichier et le nom du dossier
			$dest_fichier = basename($_FILES['PDF']['name']);  
			
			
			// enlever les accents
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			
			// remplacer les caracteres autres que lettres, chiffres et point par _
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
			
			// copie du fichier
			move_uploaded_file($_FILES['PDF']['tmp_name'], $dest_dossier . $dest_fichier);


/*
****************************************************************
*             CONNECTION A LA BASE DE DONNEE                   *
****************************************************************
*/

			// connection a la base de donnée
			include ("../include/connectBD.inc.php");
			
			// création des variable depuis le formulaire de saisie
				$congres = strtoupper($_POST['congres']); //mettre ne majuscule
				$mois =$_POST['mois'];
				$debut =$_POST['date_debut'];
				$fin =$_POST['date_fin'];
				$ville =$_POST['ville'];
				$pays =$_POST['pays'];
				$commercial =$_POST['commercial'];
				$inscription =$_POST['inscription'];
				$budget =$_POST['budget'];
				$conferencier =$_POST['conferencier'];
				$presse =$_POST['presse'];
				$soutien =$_POST['soutien'];
				$nom_pdf = $_FILES['PDF']['name'];
				$poid_pdf = $_FILES['PDF']['size'];
				$chemin_pdf = $dest_dossier.$_FILES['PDF']['name'];
				
				// Convertion de la date debut
				  $date_fr_debut = $debut;
				  $date_us_debut = implode('-',array_reverse  (explode('/',$date_fr_debut)));
				  
				// Convertion de la date fin 
				  $date_fr_fin = $fin;
				  $date_us_fin = implode('-',array_reverse  (explode('/',$date_fr_fin)));
			
				
			// creation d'une variable qui demande d'inserer les donnée dans la BD 
			$sql = "INSERT INTO agenda
					VALUES
					('','$congres','$mois','$date_us_debut','$date_us_fin','$ville','$pays','$commercial','$inscription','$budget','$conferencier','$presse','$soutien','$nom_pdf','$poid_pdf','$chemin_pdf')";
					
			//// Envoie une requête SQL à un serveur MySQL , donc mysql_query (utilise la variable $sql qui demande l'insertion d'element dans une table
			mysql_query ($sql);
							
				$confirmation = '<p align="center"><span class="Titre_h2">L\'ajout du  congr&egrave;s &agrave; bien &eacute;t&eacute; pris en compte.<br />
								<span class="Titre_h2">Il est  d&eacute;sorm&eacute; visible pour tous les utilisateurs.</span></span><br />
								</p>';
							}
}
/*****************************************************************/
		
// Envoie une requête SQL à un serveur MySQL , donc mysql_query (utilise la variable $sql qui demande l'insertion d'element dans une table
mysql_query ($insertion_dans_la_table) or die ("Exécution de la requêtes impossible.");

?>
et je voudrais mettre cette syntax qui me permettrais de changé le nom du fichier uploadé... (etant débutant peu êtres qu'il y a des erreurs...)
// TEST DE CHANGEMENT DE NOM DU FICHIER UPLOADER
			//modification du nom, tout en minuscule "nom_du_congres_nom_du_fichier.pdf" :
			$changement_nom_pdf1 = strtolower ($congres.'_'.$dest_fichier);  
quand je test, j'insere la syntax ci-dessus juste après la partie de code suivante
// formatage du nom du fichier / Sépare le nom du fichier et le nom du dossier
			$dest_fichier = basename($_FILES['PDF']['name']);  
mais bien evidement cela ne marche pas, car la variable $congres n'est pas encore définie (enfin, je pense ?), elle est definie plus bas dans le code....
je suis entraint de me creusé la tete pour savoir ou dois-je placer cette syntax pour quelle puisse marché

j'ai fais un essaie en montant les déclarations de variable en haut de page, mais la je me retrouve avec des variable qui ne sont pas encore définie ??? (message erreur)

Comment puis-je faire ?

ViPHP
ViPHP | 1996 Messages

22 févr. 2007, 22:26

Tu peux faire avec une étape supplémentaire avec les fonctions rename(); ou copy().

Leurs avantages :tu upload ton fichier, tu le vérifie et tu le renomme. L'avantage en plus de copy() et que tu peux changer de dossier.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 févr. 2007, 22:40

Pour résoudre ton problème, je te conseillerais plutôt de déplacer le code suivant au début de ta méthode :
/*
****************************************************************
*             CONNECTION A LA BASE DE DONNEE                   *
****************************************************************
*/

            // connection a la base de donnée
            include ("../include/connectBD.inc.php");
            
            // création des variable depuis le formulaire de saisie
                $congres = strtoupper($_POST['congres']); //mettre ne majuscule
                $mois =$_POST['mois'];
                $debut =$_POST['date_debut'];
                $fin =$_POST['date_fin'];
                $ville =$_POST['ville'];
                $pays =$_POST['pays'];
                $commercial =$_POST['commercial'];
                $inscription =$_POST['inscription'];
                $budget =$_POST['budget'];
                $conferencier =$_POST['conferencier'];
                $presse =$_POST['presse'];
                $soutien =$_POST['soutien'];
                $nom_pdf = $_FILES['PDF']['name'];
                $poid_pdf = $_FILES['PDF']['size'];
                $chemin_pdf = $dest_dossier.$_FILES['PDF']['name']; 
1/ Si la connexion à la base de données plante, il n'y a rien de fait, c'est toujours mieux que a moitié fait

2/ Comme ça, ta variable $congres est définie lors de déplacement

3/ mieux vaut utiliser directement le bon nom, parce que un copy() utilise du temps procésseur

La classe finale ressemblera à ça :
?php
// UPLOAD DE FICHIER

/*
****************************************************************
*                VERIFICATION AVANT UPLOAD                     *
****************************************************************
*/

if(isset($_FILES['PDF'])) // si la variable PDF existe
{
    // paramettre
    unset($erreur);                         // Detruire la variable $erreur (ne pas affiché la variable)
    $extensions_ok = array('pdf');          // Autorisé juste les fichiers PDF
    $taille_max = 4194304;                   // avec un poid MAXIMUM de 4Mo (1Mo = 1000000)
    $dest_dossier = 'PDF_programme/';       // Chemin du dossier qui vas recevoir les PDF... utilisez également des slashes sous windows : $dest_dossier = 'd:/damien/photos/';
    
        // vérifications
        if( !in_array( substr(strrchr($_FILES['PDF']['name'], '.'), 1), $extensions_ok ) )
            {
            $erreur = 'Seul les fichiers au <strong>format PDF<strong/> sont accepté, veuillez recommencer !';
            }
            
        elseif( file_exists($_FILES['PDF']['tmp_name'])and filesize($_FILES['PDF']['tmp_name']) > $taille_max)
            {
            $erreur = 'Le fichier ne doit pas dépasser <strong>4 Méga</strong>, si vous souhaitez le réduire contacté "Stephane" !';
            }
    
    
    
    
/*
****************************************************************
*                    ENVOIE DU FICHIER                         *
****************************************************************
*/
        
        // si la variable ERREUR n'existe pas
        if(!isset($erreur))                                      
            {
/*
****************************************************************
*             CONNECTION A LA BASE DE DONNEE                   *
****************************************************************
*/

            // connection a la base de donnée
            include ("../include/connectBD.inc.php");
            
            // création des variable depuis le formulaire de saisie
                $congres = strtoupper($_POST['congres']); //mettre ne majuscule
                $mois =$_POST['mois'];
                $debut =$_POST['date_debut'];
                $fin =$_POST['date_fin'];
                $ville =$_POST['ville'];
                $pays =$_POST['pays'];
                $commercial =$_POST['commercial'];
                $inscription =$_POST['inscription'];
                $budget =$_POST['budget'];
                $conferencier =$_POST['conferencier'];
                $presse =$_POST['presse'];
                $soutien =$_POST['soutien'];
                $nom_pdf = $_FILES['PDF']['name'];
                $poid_pdf = $_FILES['PDF']['size'];
                $chemin_pdf = $dest_dossier.$_FILES['PDF']['name'];
                
                
                // formatage du nom du fichier / Sépare le nom du fichier et le nom du dossier
				$dest_fichier = basename($_FILES['PDF']['name']);  
				
				
				// enlever les accents
				$dest_fichier = strtr($dest_fichier,
				'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
				'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
				
				// remplacer les caracteres autres que lettres, chiffres et point par _
				$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
                
				//modification du nom, tout en minuscule "nom_du_congres_nom_du_fichier.pdf" :
				$changement_nom_pdf1 = strtolower ($congres.'_'.$dest_fichier);
                
                // copie du fichier
				move_uploaded_file($_FILES['PDF']['tmp_name'], $dest_dossier . $dest_fichier);
                
                // Convertion de la date debut
                  $date_fr_debut = $debut;
                  $date_us_debut = implode('-',array_reverse  (explode('/',$date_fr_debut)));
                  
                // Convertion de la date fin 
                  $date_fr_fin = $fin;
                  $date_us_fin = implode('-',array_reverse  (explode('/',$date_fr_fin)));
            
                
            // creation d'une variable qui demande d'inserer les donnée dans la BD 
            $sql = "INSERT INTO agenda
                    VALUES
                    ('','$congres','$mois','$date_us_debut','$date_us_fin','$ville','$pays','$commercial','$inscription','$budget','$conferencier','$presse','$soutien','$nom_pdf','$poid_pdf','$chemin_pdf')";
                    
            //// Envoie une requête SQL à un serveur MySQL , donc mysql_query (utilise la variable $sql qui demande l'insertion d'element dans une table
            mysql_query ($sql);
                            
                $confirmation = '<p align="center"><span class="Titre_h2">L\'ajout du  congr&egrave;s &agrave; bien &eacute;t&eacute; pris en compte.<br />
                                <span class="Titre_h2">Il est  d&eacute;sorm&eacute; visible pour tous les utilisateurs.</span></span><br />
                                </p>';
                            }
}
/*****************************************************************/
        
// Envoie une requête SQL à un serveur MySQL , donc mysql_query (utilise la variable $sql qui demande l'insertion d'element dans une table
mysql_query ($insertion_dans_la_table) or die ("Exécution de la requêtes impossible.");

?>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 169 Messages

23 févr. 2007, 10:55

Merci beaucoup pour ses explications, mon bien aider...

une derniere sugestion ?

le faite d'utilisé
// TEST DE CHANGEMENT DE NOM DU FICHIER UPLOADER
			//modification du nom, tout en minuscule "nom_du_congres_nom_du_fichier.pdf" :
			$changement_nom_pdf1 = strtolower ($congres.'_'.$dest_fichier);  
est moins bien que d'utilisé Rename() ou Copy() ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 févr. 2007, 11:01

move_uploaded_file() fait la même action que copy() ou rename().

Donc, faire un move_uploaded_file() puis un copy() ou rename() reviens à faire 2 fois la même action.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 1996 Messages

23 févr. 2007, 11:10

Coucou tout le monde.

J'ai utilisé move_uploaded_file() pour mettre mes fichiers dans un répertoire temporaire afin de tester leur intégrité et leur type MIME. Ensuite en les renommant, cela permet de les valider. Comme j'ai deux étapes, j'ai pensé donné mon exemple.
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 169 Messages

23 févr. 2007, 11:12

Je vous remercie de votre paricipation a tout les deux.
cordialement

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 févr. 2007, 11:57

Coucou tout le monde.

J'ai utilisé move_uploaded_file() pour mettre mes fichiers dans un répertoire temporaire afin de tester leur intégrité et leur type MIME. Ensuite en les renommant, cela permet de les valider. Comme j'ai deux étapes, j'ai pensé donné mon exemple.
Il est possible de tester les types MIME directement lors de l'upload avec $FILES ou encore de réaliser des opérations directement sur le fichier temporaire avant d'utiliser move_uploaded_file()
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer