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] Upload en local


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut [Upload] Upload en local
    dsl c'est encore moi.

    formulaire avec upload de photo, je me suis largement
    basé sur un tuto du site, j'ai fait la base...
    et ça marche pas.
    le but est de placé la photo dans un dossier précis et de
    mettre seulement le chemin dans la base.

    Q1: je suis en local, si je test l'upload est ce que ça joue ?

    Q2: y a-t-il une boulette dans mon schmilblik?

    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
    30
    31
    32
     
    if(isset($_FILES['photo']))
    {
      // params
      unset($erreur);
      $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
      $taille_max = 25000;
      $dest_dossier = 'C:/.../photo/';
      // vérifications
      if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
      {
        $erreur = 'Pour votre photo veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
      }
      elseif( file_exists($_FILES['photo']['tmp_name']) 
              and filesize($_FILES['photo']['tmp_name']) > $taille_max)
      {
        $erreur = 'Votre fichier doit faire moins de 25Ko !';
      }
      // copie du fichier
      if(!isset($erreur))
      {
        $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-9]+)/i', '_', $dest_fichier);
        // copie du fichier
        move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
        chmod($dest_fichier, 0755);
      }
    }
    dans le même script j'ai un UPDATE
    en bdd qui marche bien avant ça et un header après qui
    fonctionne aussi.

  2. #2
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par warwill
    ça ne marche pas
    Mais encore ?

    Citation Envoyé par warwill
    le but est de placé la photo dans un dossier précis et de
    mettre seulement le chemin dans la base
    Cette deuxième partie (liée à la base) n'est pas montrée ici. Est-ce volontaire ?

    Citation Envoyé par warwill
    Q1: je suis en local, si je test l'upload est ce que ça joue ?
    Non, pas par rapport à votre code qui semble ici être portable (respecte la séparation client/serveur).

    Citation Envoyé par warwill
    Q2: y a-t-il une boulette dans mon schmilblik?
    Doit-on chercher quelque chose de particulier ?

    Le résultat de la fonction move_uploaded_file n'est pas testé donc si le déplacement échoue le chmod échouera aussi (ce serait également l'endroit pour procéder à une insertion/mise à jour de votre base). De plus, le chemin fournit à la fonction chmod est incomplet, je pense qu'il devrait être : $dest_dossier . $dest_fichier.

    Dernière chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset($_FILES['photo']))
    sera toujours vrai même si aucun fichier n'a été sélectionné par l'utilisateur. Il faudrait utiliser le code d'erreur ou tester que les éléments de ce tableau ne sont pas vides pour déterminer l'absence ou non d'une tentative d'upload.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    ça marche pas = ça upload pas.
    la seconde partie n'est pas encore dans le script
    je veux déjà arriver à uploader avant de rajouter
    le chemin à la base.le dossier final est toujours
    le même, reste le nom de la photo.
    existe t il une fonction type mysqlerror() pour l'upload?
    je fais toujours mes tests moteur en circonstance parfaites
    donc avec le bon type de fichier, la bonne taille...
    je vois la sécurité quand ça marche.
    c'est la dernière partie de l'inscription des users, donc
    en début de script y a juste un UPDATE pour rajouter
    la date de création du profil(qui fonctionne bien lui)
    puis l'upload (qui upload pas)
    et un header pour rediriger vers la page d'accueil.
    j'ai changer le chmod mais ça upload toujours pas.

    EDIT:alors j'ai retirer le header de la fin et je suis
    sur une page blanche comme si il n'y avait pas d'erreur!
    j'ai essayé un echo $_FILES['photo']['error'];
    il me disait undefined index photo

  4. #4
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par warwill
    existe t il une fonction type mysqlerror() pour l'upload?
    La fonction move_uploaded_file, si on arrive jusque là, et échoue, affichera un message d'erreur.

    Avez-vous bien ajouté enctype="multipart/form-data" à votre balise form ? Que vous donne var_dump($_FILES); en condition ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    désolé de tout ce temps,j'étais très occupé.
    donc le enctype est la première chose que
    j'ai vérifié; avant de poster je lis les autre poste
    qui pourrai me concerner et j'avais déjà vu cette
    remarque donc j'ai vérifié.il est ok.

    Que vous donne var_dump($_FILES); en condition ?
    je ne sais pas, mais ça vient surtout du fait que je
    comprend pas la question.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    j'ai modifié un peu mon script, suite à la lecture
    des autres post sur l'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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    if(isset($_POST['profil4']))
    {
      // params
      unset($erreur);
      $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
      $taille_max = 25000;
      $dest_dossier = 'C:/.../photo/';
      // vérifications
      if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
      {
        $erreur = 'Pour votre avatar veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
      }
      elseif( file_exists($_FILES['avatar']['tmp_name'])
              and filesize($_FILES['avatar']['tmp_name']) > $taille_max)
      {
        $erreur = 'Votre fichier doit faire moins de 25Ko !';
      }
      // copie du fichier
      if(!isset($erreur))
      {
        $dest_fichier = basename($_FILES['avatar']['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-9]+)/i', '_', $dest_fichier);
        // copie du fichier
        if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dest_dossier . $dest_fichier))
    	{
        chmod($dest_dossier.$dest_fichier, 0755);
    	echo "photo transférer avec succès";
    	}
      }
    }
    else
    {
    echo "le formulaire n'a pas été télécharger";
    }
    et quand je valide j'obtiens plus de renseignement :
    "le formulaire n'a pas été télécharger"

    je ne comprend plus rien! j'ai 4 pages à la suite,toutes
    sur le meme modèle, les 3 premier form font bien leur boulot
    et pas celui la! cela vient-il de mon script? de ma page?

  7. #7
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Ce résultat laisse supposer que votre formulaire ne possède aucun champ nommé profil4 (à moins que vous n'utilisiez la méthode GET au lieu de POST). Est-ce le cas et à quoi correspond-il ? Peut-on avoir le code du formulaire pour commencer s'il n'est pas trop long ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    je croyais qu'il s'agissait de vérifié l'existence du formulaire!

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <form name="profil4" method="post"
     action="uplodphoto.php" enctype="multipart/from-data">
      <table align="center" border="0" cellpadding="0"
     cellspacing="0" width="470">
        <tbody>
           <tr>
            <td style="height: 24px; width: 147px;" class="formu">Avatar</td>
            <td style="height: 24px; width: 277px;" class="formu">&nbsp;taille
    max : 90x90 &nbsp; &nbsp; &nbsp; &nbsp;poids max : 10 ko</td>
            <td style="height: 24px;" class="formu">&nbsp;</td>
          </tr>
          <tr>
            <td style="height: 26px; width: 147px;" class="formu">un
    petit portrait de vous<br>
            </td>
            <td style="height: 26px; width: 277px;" class="formu"><span
     class="petit"><input name="avatar" id="avatar"
     size="20" maxlength="60" type="file"></span></td>
            <td style="height: 26px;" class="formu"
     width="18">&nbsp;</td>
          </tr>
          <tr>
            <td style="width: 277px;" colspan="4"
     class="formuplein">&nbsp;</td>
          </tr>
          <tr>
            <td style="width: 277px;" colspan="4"
     class="formuplein">
            <div align="center"><input name="valider"
     id="valider" value="valider" type="submit"></div>
            </td>
          </tr>
          <tr>
            <td style="width: 277px;" colspan="4"
     class="formu">&nbsp; </td>
          </tr>
        </tbody>
      </table>
    </form>
    voila le formulaire.
    j'ai donc modifié le script en remplaçant le nom du form par
    le nom du champ,'avatar'.
    j'obtiens ceci:
    Undefined index: avatar in C:\...\uplodphoto.php on line 16

    voici la ligne 16:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )

  9. #9
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <form name="profil4" method="post"
     action="uplodphoto.php" enctype="multipart/from-data">
    1. Il y a une faute de frappe sur l'enctype : multipart/form-data (pas from) et qui explique que $_FILES n'existe pas.
    2. L'attribut name (ou même id) du formulaire (balise form) ne joue aucune rôle lors de sa transmission : vous n'obtiendrez pas cette information à sa réception, pour traitement. Il vous faut donc revoir votre test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset($_POST['profil4']))
    (pour voir ce qui vous est transmis, il n'y a qu'à observer le résultat de :
    et éventuellement $_FILES lorsqu'il y a upload)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    j'ai corrigé la faute

    j'ai donc modifié le script comme suit:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    var_dump($_POST);
    if(isset($_POST['avatar']))
    {
      // params
      unset($erreur);
      $extensions_ok = array('bmp', 'gif', 'jpg', 'jpeg');
      $taille_max = 25000;
      $dest_dossier = 'C:/.../photo/';
      // vérifications
      if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )
      {
        $erreur = 'Pour votre avatar veuillez sélectionner un fichier de type bmp, gif ou jpg !';  
      }
      elseif( file_exists($_FILES['avatar']['tmp_name'])
              and filesize($_FILES['avatar']['tmp_name']) > $taille_max)
      {
        $erreur = 'Votre fichier doit faire moins de 25Ko !';
      }
      // copie du fichier
      if(!isset($erreur))
      {
        $dest_fichier = basename($_FILES['avatar']['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-9]+)/i', '_', $dest_fichier);
        // copie du fichier
        if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dest_dossier . $dest_fichier))
    	{
        chmod($dest_dossier.$dest_fichier, 0755);
    	echo "photo transférer avec succès";
    	}
      }
    }
    else
    {
    echo "le formulaire n'a pas été télécharger";
    }
    j'obtiens:
    undefined index avatar on line 17
    à savoir celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if( !in_array( substr(strrchr($_FILES['avatar']['name'], '.'), 1), $extensions_ok ) )

  11. #11
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Si le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset($_POST['avatar']))
    fonctionne et non les variables $_FILES['avatar']... il y a un problème. Un fichier uploadé en PHP ne figure d'aucune manière dans le tableau $_POST mais uniquement par $_FILES dès lors que la balise form possède l'attribut enctype de telle sorte que sa valeur soit multipart/form-data

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    et pourtant tel est bien le cas!
    j'ai remodifier le script avec 2 var_dump
    un pour $_POST et un pour $_FILES
    j'obtien un array(1) avec une chaine contenant le nom
    de mon image pour le premier et un array(0) pour le second.
    dans ma balise form y a method="post",pour moi c'est normal
    mais je débute, ce serai pas ça le problem?



    warwill,
    spécialité...heu...les trucs cheloud!!

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    probleme résolut!!
    un petit / à la fin de mon chemin en plus,
    j'ai déplacer le chmod et je l'ai changer en 755( au lieu de 0755).
    et 2 ou 3 testes plus loin ça marche.
    merci à tous.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    Encore et toujours de probleme d'upload!
    la même mais sur server!
    même page, même script, et rien n'est uploader.
    par contre je suis pas sur du chemin.j'aimerais
    utiliser la méthode absolu(si je me trompe pas!!).
    mon site est dans un dossier /web, et dans ce dossier
    j'ai un /photo dans lequel je veux uploader les images.
    j'ai laissé tout les messages de vérification dans le script mais
    il n'affiche rien comme si tout passait, alors que l'upload n'est pas
    fait.
    je ne désespère plus j'ai dépassé ce stade...

  15. #15
    Expert éminent sénior

    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
    Points : 17 777
    Points
    17 777
    Par défaut
    Vous devez vous assurer que le chemin utilisé est correct. Pour cela, vous pouvez vous baser sur les fonctions realpath/getcwd (obtenir le chemin absolu du répertoire courant) ou encore éventuellement sur la variable $_SERVER['DOCUMENT_ROOT'] (qui devrait indiquer la racine de votre site).

    Vous devez également donner les droits d'écriture au serveur web sur le répertoire accueillant ces fichiers uploadés.

    Faites également des tests simples : assurez-vous que vos fichiers respectent les types que vous avez indiqués et surtout qu'ils soient de taille tout à fait respectable (suivant configuration de PHP et celles que vous avez implantées).

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 156
    Points : 102
    Points
    102
    Par défaut
    merci pour cette fonction (getcwd) qui m'a permit de tout résoudre.
    c'était juste un probleme de chemin, comme je le présentais.
    Encore merci à tous pour tout ce que vous faites ici.

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

Discussions similaires

  1. [Upload] Upload automatique local vers serveur
    Par killerhertz dans le forum Langage
    Réponses: 10
    Dernier message: 21/09/2007, 12h43
  2. [Upload] Upload basique de fichier en local
    Par masseur dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2007, 19h44
  3. [FTP] upload de fichier local via ftp
    Par fraizz dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 17h32
  4. [Upload] move_uploaded_file : en local et à distance
    Par dontDeleteMe dans le forum Langage
    Réponses: 2
    Dernier message: 26/04/2007, 15h39
  5. [Upload] Upload d'image en local sous easyphp
    Par camzo dans le forum Langage
    Réponses: 3
    Dernier message: 14/01/2007, 06h03

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