Changer le nom d'un fichier uploadé

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Changer le nom d'un fichier uploadé

par zeus » 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()

par kweb » 23 févr. 2007, 11:12

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

par Aureusms » 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.

par zeus » 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.

par kweb » 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() ?

par zeus » 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.");

?>

par Aureusms » 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.

Changer le nom d'un fichier uploadé

par kweb » 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 ?