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] Traitement des données du formulaire upload


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Par défaut [Upload] Traitement des données du formulaire upload
    Bonjour,

    J’ai un petit problème avec la fonction upload.

    Ca coince au niveau de l’extension fichier qui me reviens systématiqement pas correcte, je comprend pas.

    Qui peut m’aider ?

    Merci, voici ce que j’ai fait.

    Formulaire d’upload:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <form enctype = "multipart/form-data" action = "upload.php" method = "post" id = "formulimage" name = "formulimage">
    Mon image <input type = "file" name = "monimage" id = "monimage" />
    ...
    Reception des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    include("redimension.php");
     
    $fichier = upload("http//www.monsite.com/images/", "7000000000000", "monimage");
    fichier fonction upload:
    Code : 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
     
    <?php
     
    	function upload($dossierStock, $taille, $inputName) {
    		global $erreur;
    		$champFile        = $inputName;
    		$dossier          = $dossierStock; 
    		$taille_maxi      = $taille; 
    		$extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF'); 
     
    		if (isset($_FILES[$champFile])){
    			$fichier = basename($_FILES[$champFile]['name']);
    			$taille = filesize($_FILES[$champFile]['tmp_name']);
    			$extension = strrchr($_FILES[$champFile]['name'], '.'); 
     
    			//verif data
    			if (!in_array($extension, $extensions)){
    				$erreur = "extension fichier ".$fichier." pas correcte : ".$extension;
    			}
     
    			if ($taille > $taille_maxi){
    				$erreur = "image trop grosse";
    			}

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Je n'ai pas trouvé l'erreur mais à votre place j'utiliserai getimagesize() qui renvoie le type mime de l'image. Cette donnnée est beaucoup plus sûr car en testant juste textuellement l'extension un utilisateur pourrait faire passer dans le script n'importe quel type de fichier renommé en .jpg par exemple.

  3. #3
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    En ce qui concerne la sécurité, voir cette discussion : dans les références indiquées, il y en a une qui dit que getimagesize() peut être trompé. Personnellement, ce que j'ai fait et qui semble plutôt pas mal :
    1. Je fais un $file_info = pathinfo($_FILES["fichier"]["name"])
    2. J'examine la valeur de strtolower($file_info["extension"]) et je n'accepte que les valeurs "gif", "jpg" et "jpeg" par exemple.
    3. J'examine de nouveau strtolower($file_info["extension"]) : en fonction de la valeur renvoyée ("gif", "jpeg", "jpg"), je fais un $image = @imagecreatefromgif($_FILES["fichier"]["tmp_name"]) ou $image = @imagecreatefromjpeg($_FILES["fichier"]["tmp_name"])
    4. Je regarde $image : si c'est une image valide, c'est bon, sinon, message d'erreur


    Pour revenir à ton pb, pour vérifier l'extension, je te suggère de faire comme moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
    ...
    $file_info = pathinfo($_FILES[$champFile]['name']);
    $extension = strtolower($file_info['extension']);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Par défaut
    Merci pour votre aide.

    La solution de _Mac_ semble bien fonctionner.

    Néanmoins, je n'arrive pas encore à l'uploader une image :la vérif extension est ok, la vérif taille fichier est ok, maintenant ca coince au niveau du fichier temporaire temp_name.

    Vois pas bien ce qu'il faut faire avec temp_name

    J'ai aussi fais un chmod sur le fichier de destination définitive

    Merci encore pour votre aide.

    Code : 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
     
    $fichier = pathinfo($_FILES[$champFile]['name']);
    $taille = filesize($_FILES[$champFile]['tmp_name']);
    $extension = strtolower($fichier['extension']);
     
    //verif1
    if (!in_array($extension, $extensions)){
    				$erreur = "L'extension du fichier ".$fichier." n'est pas conforme : ".$extension;
    			}
    //verif2
    if ($taille > $taille_maxi){
    				$erreur = "Le fichier est trop gros";
    			}
    //verif3
    if (!isset($erreur)) {
    			$fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    			$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
    			$upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . $fichier);
     
    if ($upload){
    			chmod($dossier . $fichier, 0777);
    				} else {
    			$fichier = "Echec de l'upload !";
    				}
    				return $fichier;
    			} else {
    				echo $erreur;
    			}	
    		}

  5. #5
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par sadao Voir le message
    maintenant ca coince au niveau du fichier temporaire temp_name.
    Ca veut dire quoi exactement ? Quel est le pb exact rencontré ? Il passe dans ton if ? Est-ce que $dossier a bien la bonne valeur ? Est-ce que le répertoire existe bien et que l'utilisateur Apache/PHP peut écrire dedans ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Je rappelle que le protocole HTTP (pour PHP du moins), n'est pas utilisable en écriture ! Votre chemin de destination (http//www.monsite.com/images/) est donc incorrect et la fonction move_uploaded_file doit d'ailleurs générer un message d'erreur à ce sujet.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Par défaut
    @ julp, Merci c'était bien ca.

    Encore un ptit blème quand même. Que j'essaye ca OU ca, j'uploalde ARRAY... Pourquoi ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF');
    ...
     
    $extension = strrchr($_FILES[$champFile]['type']);
     
    OU
     
    $extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
    ...
     
    $extension = strtolower($fichier['extension']);

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Parce que la variable $fichier est maintenant un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fichier = pathinfo($_FILES[$champFile]['name']);
    Alors qu'initialement c'était une chaîne et que votre code n'a pas été entièrement adapté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fichier = basename($_FILES[$champFile]['name']);
    (au niveau du message d'erreur, de l'appel à la fonction move_uploaded_file ou encore chmod notamment)


    Vous auriez pu être plus direct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $extension = strtolower(pathinfo($_FILES[$champFile]['name'], PATHINFO_EXTENSION));
    Pour éviter de passer par une variable intermédiaire et entraîner toutes ces complications.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Par défaut
    @ Julp Ok Merci.

    Mais qu'est qui n'est pas bon dans l'appel move_uploaded_file et chmond si j'appelle un tableau au lieu d'une chaine

    J'ai indiqué le filename et la destination : ( string $filename , string $dossier )
    et le chmod, normalement c'est bien ce qu'il faut faire...

    J'ai cherhcé dans la doc Php mais J'vois pas ce qui faut faire

  10. #10
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    J'ai rien compris

    Dans un move_uploaded_file, la cible, c'est pas que le dossier, c'est le dossier + le nom du fichier définitif.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par sadao
    Mais qu'est qui n'est pas bon dans l'appel move_uploaded_file et chmond si j'appelle un tableau au lieu d'une chaine
    Le type approprié pour indiquer un chemin vers un fichier est une chaîne. Prenez pour référence l'extrait de la documentation que vous citez : ces fonctions attendent des string comme paramètres. Pourquoi ça ne fonctionne pas avec un tableau ? Tout simplement parce que PHP ne saura pas effectuer cette conversion tableau vers chaîne de caractères, c'est trop complexe (faudrait-il notamment prendre les clés et les valeurs, uniquement les valeurs lors d'une interpolation ?). C'est ainsi, que vous obtenez "Array" lorsque vous tentez tout de même de le faire. Tout ceci sans tenir compte du fait qu'en plus, votre "tableau" (la variable $fichier), n'indique pas vraiment, comme l'a souligné _Mac_, le chemin vers le fichier.

    Pour corriger, je vous ai donné une solution pour conserver votre code "initial". Sinon vous devrez renommer vos variables ou modifier les lignes que j'ai indiqué.

    Solution 1, à partir du code initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $extensions       = array('.png', '.gif', '.jpg', '.jpeg', '.JPG', '.JPEG', '.PNG', '.BMP', '.bmp', '.GIF');
     
    $extension = strrchr($_FILES[$champFile]['name'], '.');
    A remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $extensions       = array('png', 'gif', 'jpg', 'jpeg', 'bmp');
     
    $extension = strtolower(pathinfo($_FILES[$champFile]['name'], PATHINFO_EXTENSION));
    Solution 2, à partir du code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $erreur = "L'extension du fichier ".$fichier." n'est pas conforme : ".$extension;
     
    $upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . $fichier);
     
    chmod($dossier . $fichier, 0777);
     
    return $fichier;
    Deviennent, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $erreur = "L'extension du fichier ".basename($_FILES[$champFile]['name'])." n'est pas conforme : ".$extension;
     
    $upload = move_uploaded_file($_FILES[$champFile]['tmp_name'], $dossier . basename($_FILES[$champFile]['name']));
     
    chmod($dossier . basename($_FILES[$champFile]['name']), 0777);
     
    return basename($_FILES[$champFile]['name']);
    (je n'ai testé aucune proposition)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 13
    Par défaut
    @ Julp : MERCI !

    Merci aussi pour l'explication et la démonstration magistrale

    Merci aussi à _Mac_

    Pour ceux que cela peut aider : la solution 2 de Julp est la meilleure.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/06/2013, 14h38
  2. [MySQL] Traitement des données sur une checkbox - Formulaire
    Par kenjiendo dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 08/08/2011, 11h35
  3. Traitement des données provenant d'un formulaire
    Par captainflex dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 03/05/2007, 15h21
  4. Problème: formulaire et traitement des données
    Par Pahcixam dans le forum Langage
    Réponses: 3
    Dernier message: 29/10/2006, 04h37
  5. [Formulaires] Traitement des données dans une autre page...
    Par sekiryou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2006, 09h08

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