PHP - Envoi d'un fichier par HTTP POST

Fermé
alex.kirchen - 26 juin 2008 à 16:18
 parweb - 9 mars 2009 à 13:35
Hello!

Je voudrais écrire un script PHP qui permette d'envoyer un fichier sur un serveur par méthode POST (manuellement, on utiliserait un input type="file" en HTML):
En gros, j'envoie une requête HTTP et je récupère la réponse du serveur à l'aide de fopen.
Voilà mon code pour le moment:
(pour ceux qui ne connaissent pas la fonction stream_context_create: voir exemple sur la page https://www.php.net/manual/fr/function.stream-context-create.php

$fichier='image.png';
$fichier=chunk_split(base64_encode(file_get_contents($fichier)));
$opts = array(
			'http'=>array(
							'method' => 'POST',
							'header' => "Host: blablabla.fr\r\n" .
										"User-Agent: {$_SERVER['HTTP_USER_AGENT']}\r\n" .
										"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" .
										"Accept-language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n" .
										"Accept-Encoding: gzip,deflate\r\n" .
										"Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n".
										"Keep-Alive:300\r\n".
										"Connection:keep-alive\r\n".
										"Referer:blablabla\r\n".
										"Content-Type:multipart/form-data; boundary=-----------------------------306262331012750\r\n".
														"\r\n".
										"-----------------------------306262331012750\r\n".
										"Content-Disposition: form-data; name=\"image\"; filename=\"image.png\"\r\n".
										"Content-Type: image/png\r\n".
										"Content-Transfer-Encoding: base64\r\n".
										"\r\n".
										"$fichier\r\n".
										"-----------------------------306262331012750--\r\n"
						)
		);
		
		
$context = stream_context_create($opts);
$fp = fopen("page.php", 'r', false, $context);

...
...


(Le numéro -----------------------------306262331012750 est choisi par hasard)

Je suis tombé sur la page http://www.commentcamarche.net/faq/sujet 2761 langages envoyer un mail avec piece jointe qui explique la requête HTTP à utiliser pour l'envoi d'un fichier dans le cas d'un mail et l'auteur précise que le principe est le même pour les pages web.
Mais je n'arrive pas à faire marcher le code... (la page de destination affirme qu'aucun fichier n'a été envoyé)!

Voilà.
Quelqu'un pourrait-il analyser ma requête PHP et essayer de voir ce qui cloche?
Merci!

Alex

PS: J'ai téléchargé le module complémentaire HttpFox pour Firefox qui affiche les requêtes/réponses HTTP envoyées/reçues par le navigateur mais ce dernier affiche tout dans un tableau et dans différents onglets ... Ne connaissez-vous pas de programme qui affiche les requêtes "en brut", c-àd la requête complète et intouchée envoyée par le navigateur (et les réponses du serveur) au format texte?
(Cela m'aiderait pour essayer à résoudre ce problème)
A voir également:

2 réponses

Je sais que ca fait tard, mais je viens de tomber sur ce message, donc si d'autres le lisent en esperant trouver la solution, je la donne, elle est plutot simple.
Tu as une erreur dans les "boundary".
Imaginons que le boundary soit : 123456789
alors avant chaque debut de partie MIME nous aurons un truc comme ca :
--123456789\r\n

et à la fin de toutes les parties ayant ce boundary il y aura : --123456789--
Donc dans ton cas il manque des tirets ^^

Pour plus d'infos voir la RFC qui décrit le fonctionnement des type mime multipart : http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
4
quelqun pourait m'expliquer ce que s'est le boundary, et comment on le trouve ?
0