IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload multiple de fichiers


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut Upload multiple de fichiers
    Bonjour à toutes et à tous,

    J'effectue un upload multiple de fichiers (4 fichiers), mais seul le premier fichier est uploadé alors que les autres ne le sont pas.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // on parcourt le tableau et la clé de l'élément courant est copiée dans $k tandis que sa valeur est copiée dans $v
    				foreach($_FILES['photo']['name'] as $k=>$v) {
    					$tmp = $_FILES['photo']['tmp_name'][$k]; 
    					$fichiers = array($k => $v);
    					// Rappel : c'est à partir de la clé que l'on retrouve la valeur dans le tableau indexé
    					$photo = basename($fichiers[$k]); // le chemin du nom du fichier uploadé
    					// on vérifie que le fichier uploadé est une image pour cela ...
    					// on récupère l'extension du fichier uploadé et on la met en minuscule
    					$ext = explode('.',$photo);
    					$img = end($ext); // pour récupérer l'extension du fichier uploadé
    					// on place les extensions dans un tableau pour pouvoir récupérer toutes les valeurs en dehors de la boucle 
    					$allow_ext = array("jpg", "jpeg", "png", "gif");
    					// il faut impérativement vérifier que le répertoire n'existe pas déjà			
    					if(!file_exists($dossier)) { // si le dossier n'existe pas encore alors ...				
    						// création d'un répertoire où seront stockées les photos	
    						mkdir("photos".'/'.$id_annonce."", 0777, true); 
    						// puis on déplace sur le serveur les fichiers uploadés
    						move_uploaded_file($tmp, $dossier . $fichiers[$k]);	
    						// on affecte le type de la photo
    						//$photo_type = $_FILES['photo']['type'];			
    					} // fin if(!file_exists($dossier))					
    				} // fin foreach()

    Je pense que le problème vient de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    move_uploaded_file($tmp, $dossier . $fichiers[$k]);
    $fichiers[$k] ne récupère que le premier fichier et "squeeze" les autres.

    Merci d'avance.
    Transact.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que tu as déjà debugué un peu ?
    Par exemple contrôle ce que contient $_FILES['photo'].

    Utilise des variables plus parlantes.
    En relecture il faut s'accrocher pour faire le lien entre $fichiers[$k] ou même $v et le nom du fichier.
    D'ailleurs pourquoi passer par ce $fichiers[$k] ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Voici ce que contient $_FILES['photo'].
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Array ( [name] => Array ( [0] => img1.jpg [1] => img2.jpg [2] => img3.jpg [3] => img4.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg [2] => image/jpeg [3] => image/jpeg ) [tmp_name] => Array ( [0] => C:\xampp\tmp\phpEF12.tmp [1] => C:\xampp\tmp\phpEF13.tmp [2] => C:\xampp\tmp\phpEF14.tmp [3] => C:\xampp\tmp\phpEF15.tmp ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 ) [size] => Array ( [0] => 17610 [1] => 21947 [2] => 10512 [3] => 7357 ) )

    Effectivement, il est plus pertinent d'utiliser des variables plus parlantes.
    D'ailleurs, je me rends compte que je ne suis peut-être pas obligé de passer par $fichiers[$k].

  4. #4
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    J'ai modifié mon code qui donne ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    		$dossier = 'photos/'.$id_annonce.'/'; // le répertoire où seront stockées les photos des annonces
     
    		$cpt = $_POST['compteur']; // On récupère notre nombre de champs
    		while($cpt) {
    			$fichier = $_FILES['photo' .$cpt];
    			$error = $fichier['error'];
     
    			if($error == UPLOAD_ERR_FORM_SIZE) { // si $error correspond au code d'un fichier trop volumineux alors ...
    				echo 'La photo est trop volumineuse !';
    			} else{
    				if($error == UPLOAD_ERR_OK) {
    					$tmp = $fichier['tmp_name']; 
    					$photo = $fichier['name'];
    					$ext = explode('.',$photo); // explode() retourne un TABLEAU de chaînes					
    					$img = end($ext); // pour récupérer l'extension du fichier uploadé
    					// on place les extensions dans un tableau pour pouvoir récupérer toutes les valeurs en dehors de la boucle 
    					$allow_ext = array("jpg", "jpeg", "png", "gif");
     
    					// il faut impérativement vérifier que le répertoire n'existe pas déjà			
    					if(!file_exists($dossier)) { // si le dossier n'existe pas encore alors ...				
    						// création d'un répertoire où seront stockées les photos	
    						mkdir("photos".'/'.$id_annonce."", 0777, true); 
    						// puis on déplace sur le serveur les fichiers uploadés
    						move_uploaded_file($tmp, $dossier . $photo);														
    					} // fin if(!file_exists($dossier))
     
    				} else {
    					echo "Erreur lors de l'upload. Le fichier n'est pas valide !";
    				}
    			} // fin if() ... else
    			$cpt--; // on décrémente le compteur puisque dans la condition du while il vaut 4
    		} // fin while($cpt)
    La dernière image est uploadée et les 3 premières ne le sont pas!

    Merci d'avance.
    Transact.

  5. #5
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    J'ai modifié mon code les 4 photos sont uploadées, par contre lorsque je crée un bloc de code visant à redimensionner les photos une seule photo est redimensionnée, uniquement la dernière.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    // Dans notre contexte nous devons récupérer 4 images pour l'upload		
    	if(isset($_FILES['photo']) && ($size =count($_FILES["photo"]["name"])) <=MAX_FILE){				
    		// boucle for pour parcourir l'ensemble des fichiers qui seront uploadés, $i correspond à chacun des fichiers traités
    		for($i=0; $i <$size; $i++) {
    			if($_FILES["photo"]["error"][$i] ===UPLOAD_ERR_OK && $_FILES["photo"]["size"][$i] <=MAX_FILE_SIZE){
    				$photo_tmp = $_FILES['photo']['tmp_name'][$i];
    				$photo_name = $_FILES['photo']['name'][$i];
    				$photo_ext = explode('.',$photo_name); // explode() retourne un TABLEAU de chaînes
    				$img = end($photo_ext); // pour récupérer l'extension du fichier uploadé
    				// on place les extensions dans un tableau pour pouvoir récupérer toutes les valeurs en dehors de la boucle 
    				$allow_ext = array("jpg", "jpeg", "png", "gif");
    if(!file_exists($dossier)) { // si le dossier n'existe pas encore alors ...	
    					// on crée le dossier où seront stockées les photos	
    					mkdir($dossier, 0777, true);
    				}
    				if(in_array(strtolower($img), $allow_ext)) { // si l'extension du fichier uploadée est dans le tableau alors ...										
    					$image_size = getimagesize($photo_tmp); // getimagesize() renvoi un tableau cf. php.net 			
    					print '<pre>';
    					print_r($image_size); // mime=>image/jpeg
    					print '</pre>';
     
    					// partie traitant le redimensionnement des images
    					if($image_size['mime'] == 'image/jpeg') { 
    						$image_src = imagecreatefromjpeg($photo_tmp);
    					} else if($image_size['mime'] == 'image/gif') {
    						$image_src = imagecreatefromgif($photo_tmp);
    					} else if($image_size['mime'] == 'image/png') {
    						$image_src = imagecreatefrompng($photo_tmp);
    					} else {
    						echo "Le format de votre image n'est pas valide !";
    						$image_src = false;				
    					}				
     
    					if($image_src !== false) { // si le format de l'image est valide
    						$image_width = 300; // taille souhaitée des images
    						// si la taille de la photo est supérieure à la taille souhaitée alors on redimensionne la hauteur et la largeur de l'image
    						if($image_width <= $image_size[0]) { 				 
    							$new_width[0] = $image_width; // nouvelle largeur
    							$new_height[1] = round(($image_size[1]/$image_size[0])*$image_width,0); // on effectue un ratio de l'image							
     
    							$image_finale = imagecreatetruecolor($new_width[0],$new_height[1]) or die ("Erreur");
    							imagecopyresampled($image_finale, $image_src,0,0,0,0,$new_width[0],$new_height[1],$image_size[0],$image_size[1]);
    							imagedestroy($image_src); // on supprime l'image source car elle ne nous est pas utile
    						} else { // sinon on conserve l'image
    							$image_size = $image_src; 
    						} // fin if() ... else	
     
    						$photo_resize = imagejpeg($image_finale,$dossier ."photo1.jpg", 100); // Affichage de l'image dans un fichier	
    						$photo_resize = time();
     
    					} // fin if($image_src !== false)
     
    					// puis on déplace sur le serveur les fichiers uploadés
    					move_uploaded_file($photo_tmp, $dossier .$photo_name);
    				} else {
    					$error = on_error($i, $photo_name);									
    					echo "Le fichier n'est pas une image !";
    				} // fin if(in_array(strtolower($img), $allow_ext)) ... else
    			} else {
    				$error = on_error($i, $photo_name);	
    			} // fin if($_FILES["photo"]["error"][$i] ===UPLOAD_ERR_OK && $_FILES["photo"]["size"][$i] <=MAX_FILE_SIZE) ... else														
    		} // fin boucle for()
     
    		if(!$error){ // $error passe à true donc les fichiers sont uploadés 
    			echo "Votre annonce est enregistrée et en attente de validation !";
    			//header( "refresh:3;url=http://localhost/clothesBusiness/index.php" ); 
     
    		}
    		$error =false;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Upload] Upload multiple de fichiers
    Par emageren dans le forum Langage
    Réponses: 5
    Dernier message: 30/11/2008, 01h38
  2. Upload multiple de fichiers
    Par patsabatier dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 27/11/2008, 20h42
  3. [1.x] Upload multiple de fichier AJAX
    Par LordBob dans le forum Symfony
    Réponses: 7
    Dernier message: 26/11/2008, 10h19
  4. [1.x] Upload multiple de fichiers via symfony
    Par phoelis1 dans le forum Symfony
    Réponses: 11
    Dernier message: 03/06/2008, 10h00
  5. [Upload] upload multiple de fichiers différents
    Par Sonny.j dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo