Como deve ser uma solicitação HTTP Multipart com vários arquivos?

Estou trabalhando em um aplicativo para iPhone que faz uma requisição HTTP multipartes com vários arquivos de imagem.

Parece que o que está acontecendo, no lado do servidor, é que uma das imagens está sendo analisada corretamente, mas os outros dois arquivos não estão.

Alguém pode postar um exemplo de solicitação multipart HTTP que contém vários arquivos de imagem?

Bem, observe que a solicitação contém dados binários, portanto, não estou postando a solicitação como tal – em vez disso, convertei todos os caracteres não-imprimíveis-ascii em um ponto (“.”).

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

Note que cada linha (incluindo a última que termina com “322–“) é terminada por uma sequência \ r \ n.

EDIT : eu estou mantendo uma resposta semelhante, mas mais aprofundada em: https://stackoverflow.com/a/28380690/895245

Para ver exatamente o que está acontecendo, use nc -l e um agente do usuário como um navegador ou cURL.

Salve o formulário em um arquivo .html :

 

Crie arquivos para upload:

 echo 'Content of a.txt.' > a.txt echo 'Content of a.html.' > a.html 

Corre:

 nc -l localhost 8000 

Abra o HTML no seu navegador, selecione os arquivos e clique em enviar e verifique o terminal.

nc imprime o pedido recebido. O Firefox enviou:

 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 Content of a.html. -----------------------------9051914041544843365972754266-- 

Além disso, o cURL deve enviar o mesmo pedido POST que o seu formulário do navegador:

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

Você pode fazer vários testes com:

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