Upload d'un fichier par curl

kedubon -  
avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Est ce qu'un éminent warrior du PHP a une réponde à mon problème ?

Voilà, je veux envoyer automatiquement par curl un fichier vers un serveur en simulant un "form" qui se présente comme ça (pour résumer) :

<FORM id="form" ENCTYPE="multipart/form-data" ACTION="/process.php" METHOD=POST>
<input id="userfile" NAME="userfile" TYPE="file"> <input name="upload" type="submit" value="Send File" >

mon code pour curl est le suivant :

$post = array(
'userfile' => '@'.'relapath(image.png)' ,
'upload' => "Send File"
);

// On effectue la requête avec cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.monsite.com/process.php');
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
$contenu_page = curl_exec($ch);
echo $contenu_page."<br />\n" ;
curl_close($ch);

Le souci est que rien ne se passe ==> le fichier n'est pas "uploader"

Vous voyez une explication ?

11 réponses

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Salut,

    Je pense que le script oublie de modifier l'entête HTTP « Content-type » en indiquant « multipart/form-data ».

    Il est également possible d'héberger plusieurs sites sur un même serveur.
    Il faut donc indiquer au serveur quel hôte (domaine) nous utilisons afin de le joindre grâce à l'entête « Host ».

    $postdata = array(
        'userfile' => '@'.realpath('image.png'),
    );
    
    $httpheaders = array(
        'Content-type' => 'multipart/form-data',
        'Host' => 'www.example.com',
    );
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/upload.php');
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheaders);
    
    $contenu_page = curl_exec($ch);
    curl_close($ch);
    
    echo $contenu_page."<br />\n" ;

    La pensée mène le monde.
    1
  2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Salut.
    À part le 'relapath' à la place de 'realpath', je ne vois pas d'erreur.
    0
  3. kedubon
     
    Le relapath est bien realpath dans mon code.
    Merci, c'est une faute frappe en faisant le billet.

    Mais ça ne marche pas pour autant :-(

    J'ai encore passé du temps cet après midi sur le sujet, mais je n'ai toujours
    pas trouvé.

    Merci quand même pour ton attention
    0
  4. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Il ne faut pas mettre de guillemets autour de la fonction realpath().
    Sinon, le résultat est '@realpath(image.png)' et pas '@C:\...\image.png'

    Voilà la ligne corrigée :
    'userfile' => '@'.realpath('image.png'),
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kedubon
     
    Merci je vais essayer ça

    Je te tiens informé du résultat

    @+
    0
  7. kedubon
     
    Bon, ben j'ai essayé et le fichier ne s'uploade toujours pas.

    En fait le site sur lequel je veux uploader est newocr.com
    pour me traduire une image de type PNG
    Et je dois dire que :
    - en mettant en dur le chemin pour l'image c'est KO
    - en lisant le fichier dans une variable que je transmet c'est KO aussi

    Je suis un sec sur cette affaire.

    D'habitude c'est moins dur les envoi de paramètres :-))

    Je continue les fouilles...
    0
  8. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Quel est le résultat de la fonction realpath() ?
    Essaye en encodant le chemin avec urlencode().
    0
  9. kedubon
     
    Pour résumer :

    * Le realpath('image') me retourne rien

    * Donc j'ai mis :
    'userfile' => '@'.'D:\images\image.png' -- pas mieux
    puis
    'userfile' => '@'.urlencode('D:\images\image.png') -- pas mieux
    puis
    'userfile' => urlencode('@D:\images\image.png') -- pas mieux non plus

    Je ne sais plus trop quoi faire...

    En tous les cas merci pour tes idées, ça me fait tester plein de trucs
    0
  10. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Est-ce que ton fichier PHP est bien dans D:\images\ ?
    Si non, alors on sait pourquoi realpath() ne retourne rien : le chemin est mauvais
    Si oui, alors je n'ai aucune idéeé concernant ce problème

    Essaye avec des slashes ( / ) au lieu des backslashes ( \ ).

    Sinon c'est peut-être un problème de taille de fichier (pas pour l'expéditeur, mais pour le récepteur ; Cf. l'option max_upload_filesize du php.ini chez le récepteur). Par défaut, la limite est de 2mo.
    0
  11. kedubon
     
    Oui mon fichier est bien dans ce répertoire (D:\images\)

    Et sur les conseils d'un connaisseur du javascript, j'ai aussi tenté de
    remplacer les "\" par des "/" mais sans succès non plus.

    Quant à mon fichier il fait 2743 octets exactement, donc je suis loin
    de la taille max - dont je m'étais inquiété d'ailleurs.
    (c'est une petite image PNG qui contient une date).

    J'ai analyser les requêtes avec Firebug et ce qu'il se passe lorsque je suis
    sur le site en question. Après le POST il retourne le lien du résultat dans le header de la réponse, et va la rechercher ensuite. C'est un peu bizarre
    comme démarche.
    Mais dans le POST il y a bien le contenu du fichier PNG.
    Ce que je n'arrive pas à faire ==> et il faudrait que je commence par là :-).

    D'où ma recherche. Je suis allé voir sur des sites US et CAN mais je ne trouve
    pas de réponse si ce n'est différentes astuces du type :
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    mais qui restent inefficaces chez moi.

    Bon, je remettrai ça demain.
    Merci beaucoup en attendant pour ton aide.

    Bonne fin de soirée
    0
  12. DoulyCreations Messages postés 265 Statut Membre 19
     
    Bonjour,

    je sais que le billet date un peu mais le résultat m'intéresse toujours.
    Si quelqu'un a la réponse au problème ça m'intéresse
    0