Upload d'un fichier par curl

kedubon -  
avion-f16 Messages postés 19252 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 ?
A voir également:

11 réponses

avion-f16 Messages postés 19252 Date d'inscription   Statut Contributeur Dernière intervention   4 507
 
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
avion-f16 Messages postés 19252 Date d'inscription   Statut Contributeur Dernière intervention   4 507
 
Salut.
À part le 'relapath' à la place de 'realpath', je ne vois pas d'erreur.
0
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
avion-f16 Messages postés 19252 Date d'inscription   Statut Contributeur Dernière intervention   4 507
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kedubon
 
Merci je vais essayer ça

Je te tiens informé du résultat

@+
0
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
avion-f16 Messages postés 19252 Date d'inscription   Statut Contributeur Dernière intervention   4 507
 
Quel est le résultat de la fonction realpath() ?
Essaye en encodant le chemin avec urlencode().
0
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
avion-f16 Messages postés 19252 Date d'inscription   Statut Contributeur Dernière intervention   4 507
 
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
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
DoulyCreations Messages postés 187 Date d'inscription   Statut Membre Dernière intervention   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