Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/07/2011, 15h58   #1
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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 :
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 :
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
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h02   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
t'as bien mis le @ dans ton $file_path ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 16h17   #3
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h28   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
il doit être en realpath
Citation:
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.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 16h32   #5
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
mon
Code :
 $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 )
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h37   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
non pas bon :

@/var/user/9/Z/h/Screenshot.png
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 16h42   #7
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
Code :
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...
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h51   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
ton fichier est hors de ton openbasedir
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h55   #9
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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 :
$post = array( "photo" => '@'.realpath($file_path));

et ça me rends
Code :
@/home/uad/Uad/var/user/9/Z/h/Screenshot.png
mais toujours rien plus d erreur de path mais toujours le resultat de
Code :
$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)
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 12h00   #10
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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 :
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>
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 15h59   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
au pire fait le en raw avec fsocketopen ou stream_socket_client
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 16h09   #12
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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" =)
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 16h11   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
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 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/07/2011, 16h29   #14
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h17   #15
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
me revoilà , alors ça fonctionne en local avec le code suivant


Code :
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 :
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 :
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 :
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>
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h22   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
quelle etait l'erreur de retour avec curl_error sur l'autre site ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h34   #17
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
Code :
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 :
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 :
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,
  ),
)
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h50   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
le problème vient de ta conf de PHP
Citation:
safe_mode or an open_basedir
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 18h02   #19
Candidat au titre de Membre du Club
 
Louis Gentil
Inscription : juillet 2010
Messages : 47
Détails du profil
Informations personnelles :
Nom : Louis Gentil

Informations forums :
Inscription : juillet 2010
Messages : 47
Points : 14
Points : 14
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 ?
Lomithrani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 18h04   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
il te rend quoi comme contenu ? ton site ne propose pas d'API ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h37.


 
 
 
 
Partenaires

Hébergement Web