2009-05-27 13 views
61

Sto lavorando a un'app per iPhone che effettua una richiesta HTTP multipart con più file di immagine.Che aspetto dovrebbe avere una richiesta HTTP Multipart con più file?

Sembra che quello che sta succedendo, sul lato server, è che una delle immagini viene analizzata correttamente, ma gli altri due file non lo sono.

Qualcuno può pubblicare una richiesta multipart HTTP di esempio che contiene più file di immagine?

risposta

112

Bene, si noti che la richiesta contiene dati binari, quindi non sto postando la richiesta in quanto tale - invece, ho convertito ogni carattere non stampabile-ascii in un punto (".").

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

noti che ogni linea (compresa l'ultima che termina con "322--") termina con un \ r sequenza \ n.

+46

solo per evitare qualsiasi confusione : nota che prima di ogni stringa limite nel contenuto ci sono due trattini in più - . Per l'ultima riga è - - –

+0

Qualche buona idea su come creare un file multipart come questo con un ciclo for? Il mio problema sta nel fatto che "-" prima della finale \ r \ n. Se fosse solo alla fine, potrei appenderlo ... Farei un controllo se tu fossi all'oggetto finale nella tua matrice per ciclo e aggiungi qualcosa di diverso? – turkeyhundt

+1

@turkeyhundt - due opzioni mi vengono in mente immediatamente: 1) scrivi il tuo loop come (confine di stampa, materiale di stampa), e poi dopo che il ciclo for completo lo segui con (stampa confine con trattini extra). Questo è probabilmente il modo più semplice. 2) scrivi il tuo ciclo for() per eseguire qualsiasi variabile di indice che hai fino a 0, invece che da 0. Poi aggiungi due trattini in più quando stampi il confine alla fine se la variabile di indice è 0. –

31

EDIT: Sto mantenendo una simile, ma più risposta approfondita a: https://stackoverflow.com/a/28380690/895245

Per vedere esattamente cosa sta succedendo, utilizzare nc -l e un agente utente come un browser o curl.

Salvare il modulo a un .html di file:

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

creare i file da caricare:

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

Run:

nc -l localhost 8000 

Aprire il codice HTML del browser, selezionare i file e clicca su invia e controlla il terminale.

nc stampa la richiesta ricevuta. Firefox ha inviato:

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 deve inviare la stessa richiesta POST come una forma del browser:

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

Si può fare più test con:

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

Grazie per il bel post. Come calcoli la lunghezza del contenuto? È la durata di tutti i contenuti dei contenuti (ad esempio, solo "testo predefinito") o include le descrizioni (da --- 90xx66 fino a -90xx66--)? – mojovski

+0

@mojovski Penso che conti tutto, ma non sicuro al 100%. Prova un esempio minimale sul tuo browser con questa tecnica + 'wc' per verificarlo + prova a leggere lo standard HTTP ;-) Penso che copia incolla dallo stack overflow +' xsel -b | wc' non corrisponde perché i server rispondono con '\ r \ n' alla fine di ogni riga, ma a un certo punto sono stati convertiti in' \ n'. Suonami se concludi qualcosa. –

Problemi correlati