web-dev-qa-db-fra.com

À quoi devrait ressembler une requête HTTP en plusieurs parties avec plusieurs fichiers?

Je travaille sur une application iPhone qui crée une requête HTTP en plusieurs parties avec plusieurs fichiers image.

Il semble que ce qui se passe côté serveur, c’est que l’une des images est correctement analysée, mais pas les deux autres fichiers.

Quelqu'un peut-il envoyer un exemple de requête HTTP multipart contenant plusieurs fichiers image?

82
bpapa

Notez bien que la demande contient des données binaires. Par conséquent, je ne la poste pas en tant que telle. J'ai converti tous les caractères non imprimables en un point (".").

POST /cgi-bin/qtest HTTP/1.1
Host: aram
User-Agent: Mozilla/5.0 Gecko/2009042316 Firefox/3.0.10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://aram/~martind/banner.htm
Content-Type: multipart/form-data; boundary=----------287032381131322
Content-Length: 514

------------287032381131322
Content-Disposition: form-data; name="datafile1"; filename="r.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
------------287032381131322
Content-Disposition: form-data; name="datafile2"; filename="g.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
------------287032381131322
Content-Disposition: form-data; name="datafile3"; filename="b.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
------------287032381131322--

Notez que chaque ligne (y compris la dernière se terminant par "322--") est terminée par une séquence\r\n.

137
Daniel Martin

[~ # ~] edit [~ # ~] : Je maintiens une réponse similaire, mais plus détaillée, à l'adresse: https: //stackoverflow.com/a/28380690/895245

Pour voir exactement ce qui se passe, utilisez nc -l et un agent utilisateur tel qu'un navigateur ou un CURL.

Enregistrez le formulaire dans un .html fichier:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text" value="text default">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><button type="submit">Submit</button>
</form>

Créer des fichiers à télécharger:

echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html

Courir:

nc -l localhost 8000

Ouvrez le code HTML de votre navigateur, sélectionnez les fichiers, cliquez sur Soumettre et vérifiez le terminal.

nc imprime la requête reçue. Firefox envoyé:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266
Content-Length: 554

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="text"

text default
-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>

-----------------------------9051914041544843365972754266--

Normalement, cURL devrait envoyer la même demande POST) que votre formulaire de navigateur:

nc -l localhost 8000
curl -F "text=default" -F "[email protected]" -F "[email protected]" localhost:8000

Vous pouvez faire plusieurs tests avec:

while true; do printf '' | nc -l localhost 8000; done