2009-05-27 7 views
61

Ich arbeite an einer iPhone-App, die eine mehrteilige HTTP-Anfrage mit mehreren Bilddateien macht.Wie sollte eine Multipart HTTP-Anfrage mit mehreren Dateien aussehen?

Es sieht so aus, als ob auf der Serverseite eines der Bilder richtig geparst wird, aber die anderen beiden Dateien nicht.

Kann jemand eine Beispiel-HTTP-Multipart-Anfrage stellen, die mehrere Bilddateien enthält?

Antwort

112

Nun, beachten Sie, dass die Anfrage binäre Daten enthält, also posten ich die Anfrage nicht als solche - stattdessen habe ich jedes nicht-druckbare ASCII-Zeichen in einen Punkt (".") Umgewandelt.

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

anzumerken, dass jede Linie (einschließlich der letzten, die mit „322--“ endet) um eine \ r \ n-Sequenz wird beendet.

+46

nur Verwirrung zu vermeiden Beachten Sie, dass vor jeder Begrenzungszeichenfolge im Inhalt zwei zusätzliche Bindestriche angezeigt werden: . Für die letzte Zeile ist - - –

+0

Irgendwelche guten Ideen zum Erstellen einer mehrteiligen Datei wie folgt mit einer for-Schleife? Mein Problem liegt bei diesem zusätzlichen "-" vor dem endgültigen \ r \ n. Wenn es nur am Ende wäre, könnte ich es anhängen ... Würdest du überprüfen, ob du das letzte Objekt in deinem for-loop-Array warst und etwas anderes anhängen? – turkeyhundt

+1

@turkeyhundt - zwei Optionen kommen sofort in den Sinn: 1) schreibe deine Schleife als (Grenze drucken, Zeug drucken), und dann, nachdem die for Schleife abgeschlossen ist, folge dem mit (Grenze drucken mit zusätzlichen Bindestrichen). Das ist wahrscheinlich der einfachste Weg. 2) Schreiben Sie Ihre for() -Schleife, um was auch immer Index-Variable Sie auf 0 statt von oben 0 ausführen. Dann fügen Sie zwei zusätzliche Bindestriche, wenn Sie die Grenze am Ende drucken, wenn die Indexvariable 0 ist. –

31

EDIT: Ich bin die Aufrechterhaltung einer ähnlichen, aber tiefer gehende Antwort auf: https://stackoverflow.com/a/28380690/895245

genau zu sehen, was, verwenden nc -l und ein User-Agent wie ein Browser oder cURL geschieht.

Speichern Sie das Formular an eine .html Datei:

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

Dateien erstellen laden:

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

Run:

nc -l localhost 8000 

Öffnen Sie die HTML-Datei auf Ihrem Browser, wählen Sie die Dateien und klicken Sie auf Senden und überprüfen Sie das Terminal.

nc druckt die Anfrage erhalten. Firefox gesendet:

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 sollte die gleiche POST-Anfrage als einen Browser Formular senden:

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

Sie können mehrere Tests durchführen mit:

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

Vielen Dank für den tollen Beitrag. Wie berechnen Sie die Inhaltslänge? Ist die Länge aller Inhalte von Inhalten (z. B. nur "Text Standard") oder einschließlich der Beschreibungen (von --- 90xx66 bis --90xx66--)? – mojovski

+0

@mojovski Ich denke es zählt alles, aber nicht 100% sicher. Versuchen Sie ein minimales Beispiel auf Ihrem eigenen Browser mit dieser Technik + 'wc', um es auszuprobieren + versuchen Sie, den HTTP-Standard zu lesen ;-) Ich denke, Kopieren einfügen von Stack-Überlauf +' xsel -b | wc 'stimmt nicht überein, da Server am Ende jeder Zeile mit' \ r \ n' antworten, aber diese wurden irgendwann in '\ n' umgewandelt. Ping mich, wenn Sie etwas abschließen. –

Verwandte Themen