Un script PHP pour uploader des fichiers sur le serveur

Eléphant du PHP | 82 Messages

20 nov. 2005, 11:23

Bonjour.

Alors déjà le copier/coller c'est bien, mais dans votre code, il aurait fallu l'adapter.

Tout d'abord, votre script ne fait pas les vérifications d'extension et de poids max seulement pour le fichier "photo" envoyer. On vous a donné la partie pour les vérifications pour les tailles max. Pour les autres exercices, ca aurait été pour vous un bon exercice pour vous d'adapter les quelques lignes de vérification pour le logo.

Il en va de même pour la partie traitement, seul la photo est envoyé dans le dossier car seule elle est traité par le code.

Voici donc le code complet avec toutes les vérifications, les traitements et l'affichage..
<?php 

if(isset($_FILES['photo'])){ 
	
	//
    // Paramètres globaux 
	//
    unset($erreur); 
    $extensions_ok = array('png', 'gif', 'jpg', 'jpeg'); 
    $taille_max_photo = 500000; 
	$taille_max_logo = 100000;
    $dest_dossier = 'Corps_In/'; 
    
	//
    // Vérifications pour la photo 
	//
	// Extension :
	if( !in_array( strtolower(substr(strrchr($_FILES['photo']['name'], '.'), 1)), $extensions_ok ) )
    { 
        $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';   
    } 
	// Taille max :
    elseif( file_exists($_FILES['photo']['tmp_name']) 
          and filesize($_FILES['photo']['tmp_name']) > $taille_max_photo) 
    { 
        $erreur = 'Votre fichier doit faire moins de '.$taille_max_photo.' octets !'; 
    } 
    // Vérification de la taille de la photo 
    elseif(file_exists($_FILES['photo']['tmp_name'])){ 

        // Définition de la longueur et de la largeur max 
        $longueur_photo_max = "700"; 
        $largeur_photo_max = "500"; 

        $size = getimagesize($_FILES['photo']['tmp_name']); 

        if(($size[0] > $largeur_photo_max) || ($size[1] > $longueur_photo_max)){ 
            $erreur .= 'Les dimensions de la photo sont trop grandes !<br />'; 
			$erreur .= 'Taille de votre photo : '.$size[1].'x'.$size[0].'<br />';
			$erreur .= 'Taille maximale autorisée :'.$longueur_photo_max.'x'.$largeur_photo_max.'<br />';
        } 

    } 

    // 
    // Vérifications pour le logo 
    // 
	// Extension :
	if( !in_array( strtolower(substr(strrchr($_FILES['logo']['name'], '.'), 1)), $extensions_ok ) )
    { 
        $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';   
    } 
	// Taille max :
    elseif( file_exists($_FILES['logo']['tmp_name']) 
          and filesize($_FILES['logo']['tmp_name']) > $taille_max_logo) 
    { 
        $erreur = 'Votre fichier doit faire moins de '.$taille_max_logo.' octets !'; 
    }
    elseif(file_exists($_FILES['logo']['tmp_name'])){ 
     
        // Définition de la longueur et de la largeur max 
        $longueur_logo_max = "80"; 
        $largeur_logo_max = "80"; 

        $size_logo = getimagesize($_FILES['logo']['tmp_name']); 

        if(($size_logo[0] > $largeur_logo_max) || ($size_logo[1] > $longueur_logo_max)){ 
            $erreur .= 'Les dimensions du logo sont trop grandes !'; 
			$erreur .= 'Taille de votre photo : '.$size_logo[1].'x'.$size_logo[0].'<br />';
			$erreur .= 'Taille maximale autorisée :'.$longueur_logo_max.'x'.$largeur_logo_max.'<br />';
        } 

    } 
    // 
    // Fin des vérifications 
    // 

	//
	// Copie des fichiers
	//
	if(!isset($erreur))	
	{ 
		//
		// Copie de la photo.
		//
		$dest_fichier = basename($_FILES['photo']['name']); 
		// formatage nom fichier 
		// 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-1]+)/i', '_', $dest_fichier); 
		// copie du fichier 
		move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier); 
		
		//
		// Copie du logo.
		//
		$dest_fichier = basename($_FILES['logo']['name']); 
		// formatage nom fichier 
		// 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-1]+)/i', '_', $dest_fichier); 
		// copie du fichier 
		move_uploaded_file($_FILES['logo']['tmp_name'], $dest_dossier . $dest_fichier);
	} 
} 

?> 
<html> 
<body> 
<!-- Erreur ? --> 
<?php 
if(isset($erreur)){ 
  echo '<p>', $erreur ,'</p>'; 
} 
?> 
<html> 
<body> 
<!-- Erreur ? --> 
<?php 
if(isset($erreur)){ 
  echo '<p>', $erreur ,'</p>'; 
} 
?> 
<!-- Formulaire --> 
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" --> 
<form method="POST" action="Upload_2a.php" enctype="multipart/form-data"> 
<!-- Limiter la taille des fichiers à 500Ko --> 
<input type="hidden" name="MAX_FILE_SIZE" value="500000" /> 
<fieldset> 
<legend>Uploader vos images</legend> 
<!-- champs d'envoi de fichier, de type file --> 
<p><label for="logo">Uploader votre logo : </label><input type="file" name="logo" /></p> 
<p><label for="photo">Uploader votre photo : </label><input type="file" name="photo" /></p> 
<!-- bouton d'envoi --> 
<p><input type="submit" name="envoi" value="Envoyer les fichiers" /></p> 
</legend> 
</fieldset> 
</form>
Notes :
- la taille max pour la photo et le logo sont à définir par vos soins au début du code (parametre globaux, $taille_max_photo et $taille_max_logo).
- j'ai aussi modifié le message d'erreur pour la vérification des tailles, comme ca ce sera plus parlant.
Modifié en dernier par s3b54sk8 le 20 nov. 2005, 13:10, modifié 1 fois.
Sébastien.

Eléphant du PHP | 355 Messages

20 nov. 2005, 12:40

Bonjour et merci :wink:

Je viens donc de tester votre script, il me renoy le message suivant:

Code : Tout sélectionner

Warning: Wrong parameter count for strtolower() in C:\easyPHP\www\upload\upload_2a.php on line 18 Warning: Wrong parameter count for in_array() in C:\easyPHP\www\upload\upload_2a.php on line 18 Warning: Wrong parameter count for strtolower() in C:\easyPHP\www\upload\upload_2a.php on line 49 Warning: Wrong parameter count for in_array() in C:\easyPHP\www\upload\upload_2a.php on line 49 Veuillez sélectionner un fichier de type png, gif ou jpg ! Veuillez sélectionner un fichier de type png, gif ou jpg !
A savoir que les taiille des image que j'ai uploader pour tester sont de 40 px sur 40 px pour le logo et 400 px sur 350 px pour la photo.

Mammouth du PHP | 19672 Messages

20 nov. 2005, 12:59

L'erreur est la même sur les deux lignes indiquées, voici cette même ligne corrigée:
if( !in_array( strtolower(substr(strrchr($_FILES['logo']['name'], '.'), 1)), $extensions_ok) )
Il y a une des parenthèses qui avait été fermée trop loin.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 355 Messages

20 nov. 2005, 13:14

Bonjour Cyrano et merci :wink:

J'ai remplacer ce que vous m'avez conseiler de remplacer, et la la page ne s'affiche même plu.

Mammouth du PHP | 19672 Messages

20 nov. 2005, 13:32

Effectivement, c'est un problème. Alors commence maintenant un travail de moine: faire afficher les variables afin de vérifier ce qui est bon et ce qui ne l'est pas en remontant jusqu'à ce qu'on trouve quelque chose de normal : ainsi, si on a des résultats incorrects et qu'en remontant on tombe sur un résultat normal, l'erreur est entre ces deux points.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 355 Messages

20 nov. 2005, 13:34

Merci encore :wink:

Mais je ne voie pas comment afficher ses variables.

Mammouth du PHP | 19672 Messages

20 nov. 2005, 13:39

echo($variable);
peut-être bien ? ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 355 Messages

20 nov. 2005, 13:41

Merci encore et beaucoup :wink:

Mais nul que je suis en php :oops: je ne vois pas ou placer ce code.

Mammouth du PHP | 19672 Messages

20 nov. 2005, 14:31

Question pratique: penses-y avant de répondre, je dirais même que la réponse est surtout pour toi-même : arrives-tu à suivre le déroulement de l'application ? Je veux dire par là: à partir du moment où tu cliques quelque part, sais-tu quelle instruction est exécutée dans le script et que se passe-t-il en fonction de quoi ?

Si tu sais répondre à cette question, alors tu peux trouver toi-même la réponse à ta question en prenant en compte le fait que tu fais un écho() sur une variable qui doit être initialisée. Ça, c'est du PHP basique du niveau débutant.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 355 Messages

20 nov. 2005, 14:37

Je ne suis plus, je suis vraiment débutant.

Pouriez vous m'aider a comprendre ?

Eléphant du PHP | 353 Messages

20 nov. 2005, 14:53

Pour essayer de faire clair.
Imaginons que j'ai un code de 500 lignes qui ne fonctionne pas. Je vais le commenter:
<?php
echo 'avant'<br>';
/*
500 lignes de code commentées
*/
echo 'après<br>';
?>
Mon code fonctionne maintenant; enfin disons qu'il n'y a plus d'erreur.
Après tu continues en commentant des blocs plus petit: des boucles, des tests, des fonctions,...
<?php
echo 'avant bloc1'<br>';
/*
50 lignes de code commentées
*/
$i=4;
//
echo "i=$i<br>"; // affiche i=4
/*
50 autres lignes de code commentées
*/
//
bloc de code php non commenté
//
echo "i=$i<br>"; // permet de savoir si le code juste au dessus a modifié la valeur de i. 
?>
Après tu continues à décomposer; à commenter des bouts de code, à décommenter, à placer des echo pour débugger. La meilleure méthode pour avancer est de tester souvent lorsqu'on débute.

Bon courage
Modifié en dernier par nicolas le 20 nov. 2005, 17:22, modifié 1 fois.

Mammouth du PHP | 19672 Messages

20 nov. 2005, 15:21

Nicolas, voudrais-tu éditer ton message et mettre ton code entre balises [php] et [/php] :non:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 355 Messages

21 nov. 2005, 23:44

Bonjour à tous :wink:

Je voudrai ajouter une redirection a la fin de l'upload mais je n'arrive pas a la placer correctement:
<?php 
if(isset($_FILES['photo'])){ 
    // 
    // Paramètres globaux 
    // 
    unset($erreur); 
    $extensions_ok = array('png', 'gif', 'jpg', 'jpeg'); 
    $taille_max_photo = 500000; 
    $taille_max_logo = 100000; 
    $dest_dossier = '*'; 
    // 
    // Vérifications pour le logo 
    // 
    // Extension : 
    if( !in_array( strtolower(substr(strrchr($_FILES['logo']['name'], '.'), 1), $extensions_ok )) ) 
    { 
        $erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';    
    } 
    // Taille max : 
    elseif( file_exists($_FILES['logo']['tmp_name']) 
          and filesize($_FILES['logo']['tmp_name']) > $taille_max_logo) 
    { 
        $erreur = 'Votre fichier doit faire moins de '.$taille_max_logo.' octets !'; 
    } 
    elseif(file_exists($_FILES['logo']['tmp_name'])){ 
      
        // Définition de la longueur et de la largeur max 
        $longueur_logo_max = "80"; 
        $largeur_logo_max = "80"; 

        $size_logo = getimagesize($_FILES['logo']['tmp_name']); 

        if(($size_logo[0] > $largeur_logo_max) || ($size_logo[1] > $longueur_logo_max)){ 
            $erreur .= 'Les dimensions du logo sont trop grandes !'; 
            $erreur .= 'Taille de votre photo : '.$size_logo[1].'x'.$size_logo[0].'<br />'; 
            $erreur .= 'Taille maximale autorisée :'.$longueur_logo_max.'x'.$largeur_logo_max.'<br />'; 
        } 

    } 
    // 
    // Fin des vérifications 
    // 
    // 
    // Copie des fichiers 
    // 
    if(!isset($erreur))     
    { 
        // 
        // Copie de la photo. 
        // 
        $dest_fichier = basename($_FILES['photo']['name']); 
        // formatage nom fichier 
        // 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-1]+)/i', '_', $dest_fichier); 
        // copie du fichier 
        move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier); 
         
        // 
        // Copie du logo. 
        // 
        $dest_fichier = basename($_FILES['logo']['name']); 
        // formatage nom fichier 
        // 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-1]+)/i', '_', $dest_fichier); 
        // copie du fichier 
        move_uploaded_file($_FILES['logo']['tmp_name'], $dest_dossier . $dest_fichier); 
     	
	// On redirige vers le fichier suivant:	 
    echo "<script type='text/javascript'>window.location.replace('index.php');</script>";
    } 
} 

?> 
<html> 
<body> 
<!-- Erreur ? --> 
<?php 
if(isset($erreur)){ 
  echo '<p>', $erreur ,'</p>'; 
} 
?> 

<!-- Formulaire --> 
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" --> 
<form method="POST" action="upload.php" enctype="multipart/form-data"> 
<!-- Limiter la taille des fichiers à 500Ko --> 
<input type="hidden" name="MAX_FILE_SIZE" value="500000" /> 
<fieldset> 
<legend>Uploader vos images</legend> 
<!-- champs d'envoi de fichier, de type file --> 
<p><label for="logo">Uploader votre logo : </label><input type="file" name="logo" /></p> 
<!-- bouton d'envoi --> 
<p><input type="submit" name="envoi" value="Envoyer les fichiers" /></p> 
</legend> 
</fieldset> 
</form>
Quelqu'un pourait m'aider ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 nov. 2005, 00:05

tu peut utilioser un header() a la place du javascript. Regarde l'exemple 3 de la doc

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 355 Messages

22 nov. 2005, 00:16

Merci beaucoup Truc :wink:

Je connais le header j'ai essayer mais cela ne change rien, s'est le code qui doit êtr mal placer.