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 :

Simuler un formulaire avec un fichier dedans


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut Simuler un formulaire avec un fichier dedans
    Bonjour,
    Voilà je suis en stage et je travail avec scene7 j'utilise l'api pour upload et très simplement quand je fait un formulaire tout simle comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <form action="https://s7ugc3.scene7.com/ugc/image?op=upload&upload_token=<?=$token; ?>&company_name=<?=$cpnname?>" method="post" enctype="multipart/form-data">
            <p>
                    Formulaire d'envoi de fichier :<br />
                    <input type="file" name="image" /><br />
                    <input type="submit" value="Envoyer le fichier" />
            </p>
    </form>
    Ceci m envoi sur la page voulu bien sur et me renvoi un fichier xml avec les infos dont j'ai besoin (nottament l'url de l'image mtn qu elle est upload).

    Ce que je cherches à faire moi c'est d'automatiser ça en gros de simuler ce post j'ai bien tenter avec la bibli curl mais j ai fail...


    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
       $query = http_build_query(array('op' => 'upload', 'upload_token' => $token ,'company_name' => $cpnname));
        $url = "https://s7ugc3.scene7.com/ugc/image?$query";
     
     
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_VERBOSE, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_POST, true);
        // same as <input type="file" name="file_box">
     
     
     
            $post = array( "photo" => '@'.$file_path );
     
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        $response = curl_exec($ch);
    C'est possible que ce code fonctionne mais j'ai aucun moyen de récup le xml et du coup l'url donc forcément l'utilité est assez limitée .

    Merci beaucoup de toute les ideés que vous pourriez m'apporter!

    Cordialement,

    Lomi

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    t'as bien mis le @ dans ton $file_path ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    héhé stealth mon sauveur comme d'hab ! cependant celle ci je l avais déjà vu ca n'a rien changer le " $post = array( "photo" => '@'.$file_path );"

    tu aurais pas d'autre piste que Curl sinon? car curl me sors par les trou de nez, en fait envoyer un post quand y a pas de files c est plutôt simple , mais envoyer un post quand y a un file et qu'il faut récupérer la réponse ça deviens beaucoup plus tendu

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    il doit être en realpath
    CURLOPT_POSTFIELDS

    Toutes les données à passer lors d'une opération de HTTP POST. Pour envoyer un fichier, préfixez le nom du fichier avec un @ et utilisez le chemin complet. Le type de fichier peut être explicitement spécifié en faisant suivre le nom du fichier par le type au format ';type=mimetype'. Ce paramètre peut être passé sous la forme d'une chaîne encodée URL, comme 'para1=val1&para2=val2&...' ou sous la forme d'un tableau dont le nom du champ est la clé, et les données du champ la valeur. Si le paramètre value est un tableau, l'en-tête Content-Type sera définie à multipart/form-data. Depuis PHP 5.2.0, les fichiers utilisés dans cette fonction et préfixés par le symbole @ doivent être présents sous forme de tableau pour fonctionner.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $post = array( "photo" => '@'.$file_path );
    = @var/user/9/Z/h/Screenshot.png c'est pas bon ? dsl les path absolu ou relatif sur linux je suis pas trop :p (mais a priori celui la est absolu )

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    non pas bon :

    @/var/user/9/Z/h/Screenshot.png

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Warning:  curl_setopt(): open_basedir restriction in effect. File(/var/user/9/Z/h/Screenshot.png) is not within the allowed path(s): (/var/www:/tmp) in /home/uad/Uad/lib/sys/class/CDN.class.inc on line 58
    ca me donne ca maintenant avec un @/var...

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ton fichier est hors de ton openbasedir

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    mais je suis en local de toute façon si je résous mon problème sur mon apache sur mon pc une fois que je passerais ca en prod j'aurais le même soucis . Il n'y a pas de méthode simple pour simuler un $_FILES j'ai trouver la masse de méthode pour les $_POST et pas grand chose sur files ..


    sinon j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $post = array( "photo" => '@'.realpath($file_path));

    et ça me rends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @/home/uad/Uad/var/user/9/Z/h/Screenshot.png
    mais toujours rien plus d erreur de path mais toujours le resultat de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result=curl_exec ($ch);
    => result = 0


    Je pense aussi que le problème eput venir du fait qu'il s'attends a une image poster un form enctype="multipart/form-data" et que je lui envoi une image (je sais pas sous quelle fome)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Personne d'autre n'a une idée ? j'ai du mal a croire que ce soit si dur que ça de post le code suivant sans passer par une page we j'ai du louper un truc évident mais quoi ? A savoir que j'upload l'image au préalable sur mon serveur et que ca fonctionne ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <form action="https://s7ugc3.scene7.com/ugc/image?op=upload&upload_token=<?=$token; ?>&company_name=<?=$cpnname?>" method="post" enctype="multipart/form-data">
            <p>
                    Formulaire d'envoi de fichier :<br />
                    <input type="file" name="image" /><br />
                    <input type="submit" value="Envoyer le fichier" />
            </p>
    </form>

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    au pire fait le en raw avec fsocketopen ou stream_socket_client

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    au pire fait le en raw avec fsocketopen ou stream_socket_client
    :-/ c'est pas tout à fait ce que j'entendais par "simple" =)

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Lomithrani Voir le message
    :-/ c'est pas tout à fait ce que j'entendais par "simple" =)
    t'as essaye de la faire en local (CURLOPT_URL) pour tester avant ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    t'as essaye de la faire en local (CURLOPT_URL) pour tester avant ?
    Histoire de vérifié si j'arrive a récuperer ce qui est dans le $_FILES etc ? pas con ! J'avais pas penser à faire ça, justement ce qui me saoulait c'est que j'avais rien comme retour pour debugger et tout je pédalais un peu dans le vide , t'a raison je vais créer un php cible de test pour pouvoir debugger plus rapidement , je reviens vers vous si je recoince méchamment

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    me revoilà , alors ça fonctionne en local avec le code suivant


    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
    41
    42
    43
    44
    45
    function do_post_request($url, $postdata, $files = null)
    {
        $data = "";
        $boundary = "---------------------".substr(md5(rand(0,32000)), 0, 10);
     
        //Collect Postdata
        foreach($postdata as $key => $val)
        {
            $data .= "--$boundary\n";
            $data .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
        }
     
        $data .= "--$boundary\n";
     
        //Collect Filedata
        foreach($files as $key => $file)
        {
            $fileContents = file_get_contents($file['tmp_name']);
     
            $data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n";
            $data .= "Content-Type: image/jpeg\n";
            $data .= "Content-Transfer-Encoding: binary\n\n";
            $data .= $fileContents."\n";
            $data .= "--$boundary--\n";
        }
     
        $params = array('http' => array(
               'method' => 'POST',
               'header' => 'Content-Type: multipart/form-data; boundary='.$boundary,
               'content' => $data
            ));
     
       $ctx = stream_context_create($params);
       $fp = fopen($url, 'rb', false, $ctx);
     
       if (!$fp) {
          throw new Exception("Problem with $url, $php_errormsg");
       }
     
       $response = @stream_get_contents($fp);
       if ($response === false) {
          throw new Exception("Problem reading data from $url, $php_errormsg");
       }
       return $response;
    }
    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
    class CDN{
     
      const S7_SSC = "////////////";
      const S7_CPN = "////////////";
     
      public static function getS7Token(){
       if($chaine = @implode("",@file("https://s7ugc3.scene7.com/ugc/image?op=get_uploadtoken&shared_secret=".self::S7_SSC."&expires=300"))) {
         foreach (String::asSet($chaine) as $row) {
          if (preg_match('<errorMessage>', $row)) {
              throw new Exception(i18n('Token error'.$row));
          }
        }
          $tmp = preg_split("/<\/?message>/",$chaine);
          $tmp2 = preg_split("/<\/?uploadtoken>/",$tmp[1]);
          return $tmp2[1];
        }
      }
     
      public static function submitS7Picture($file, $token=null){
        if ($token == null) {
          $token = CDN::getS7Token();
        }
     
        $query = http_build_query(array('op' => 'upload', 'upload_token' => $token ,'company_name' => self::S7_CPN));
      //  $url = "https://s7ugc3.scene7.com/ugc/image?$query";
    $url = "http://uad.dev/comment/comment.test";
     
        $_FILES['photo']['name']=$file->getFileName();
        $_FILES['photo']['tmp_name']=$file->getFilePath();
        $_FILES['photo']['error']=0;
        $files['photo'] = $_FILES['photo'];
     
        $postdata = array( 'name' => 'photo'
    ); 
     
       $response= do_post_request($url, $postdata, $files);
     
     
         return $response;
    }
    donc la ça fonctionne , sur mon test php si je fais un var_dump($_FILES); j'ai bien mon image , ce qui veut dire qu'il a bien été envoyé cependant quand a la ligne 26 je change par l'url distante , ça ne marche plus je n'ai rien en return .....


    voilà le contenu de $_FILES dans mon fichier test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array (
      'photo' => 
      array (
        'name' => 'Screenshot.png',
        'type' => 'image/jpeg',
        'tmp_name' => '/tmp/php0BzSxy',
        'error' => 0,
        'size' => 87884,
      ),
    )
    quelle est donc la différence avec ce que retourne ce formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <form action="https://s7ugc3.scene7.com/ugc/image?op=upload&upload_token=<?=$token; ?>&company_name=<?=$cpnname?>" method="post" enctype="multipart/form-data">
            <p>
                    Formulaire d'envoi de fichier :<br />
                    <input type="file" name="image" /><br />
                    <input type="submit" value="Envoyer le fichier" />
            </p>
    </form>

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    quelle etait l'erreur de retour avec curl_error sur l'autre site ?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir
    Mais comme tu l'aura noté finalement j'ai opté pour une fonction avec stream_context. Qui semble d'ailleurs très bien fonctionné.

    J'ai envoyer le formulaire a la main sur mon test également histoire de comparer les 2: $_FILES

    valeur du $_FILES générer par la formulaire a la main dans le test.php (serveur windows)=

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    array
      'image' => 
        array
          'name' => string 'excel.png' (length=9)
          'type' => string 'image/png' (length=9)
          'tmp_name' => string 'C:\wamp\tmp\phpE805.tmp' (length=23)
          'error' => int 0
          'size' => int 83092
    versus valeur du $_FILES générer par le script toujours dans le test.php (serveur linux) =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array (
      'photo' => 
      array (
        'name' => 'Screenshot.png',
        'type' => 'image/jpeg',
        'tmp_name' => '/tmp/php0BzSxy',
        'error' => 0,
        'size' => 87884,
      ),
    )

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    le problème vient de ta conf de PHP
    safe_mode or an open_basedir

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    le problème vient de ta conf de PHP
    Mais je n'utilises plus cUrl pour mon script , c'est quand même ça le problème ? !

    pourquoi ca marcherait sur http://serveurtest.dev/test.php et pas sur l'url distante ?

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    il te rend quoi comme contenu ? ton site ne propose pas d'API ?

Discussions similaires

  1. comment creer un dossier avec un fichier dedans?
    Par hacker59 dans le forum VB.NET
    Réponses: 14
    Dernier message: 14/03/2014, 19h40
  2. Réponses: 0
    Dernier message: 11/07/2012, 17h38
  3. Formulaire avec upload fichier et servlet
    Par koktel_dfr dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 12/07/2011, 10h18
  4. [Système] Simuler un formulaire avec fsockopen()
    Par cyriltra dans le forum Langage
    Réponses: 6
    Dernier message: 25/07/2006, 21h35
  5. Réponses: 10
    Dernier message: 10/05/2006, 10h23

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