105 votes

À 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 les deux autres fichiers ne le sont pas.

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

175voto

Daniel Martin Points 9148

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 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) 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: 582

-----------------------------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.

61voto

Ciro Santilli Points 3341

Pour voir exactement ce qui se passe, utilisez nc -l et un agent utilisateur comme un navigateur ou cURL.

Enregistrez le formulaire à un .html le 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

Exécuter:

nc -l localhost 8000

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

nc imprime la demande 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--

Aternativelly, cURL doit envoyer la même demande POST comme votre un formulaire de navigateur:

nc -l localhost 8000
curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000

Vous pouvez faire plusieurs tests avec:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X