Beispiel für mehrteilige / Formulardaten

103

Ich frage mich, ob mir jemand ein Beispiel für mehrteilige / Formulardaten mitteilen kann, das Folgendes enthält:

  1. Einige Formularparameter
  2. Mehrere Dateien
user496949
quelle
2
Gehen Sie hier: w3.org/TR/html401/interact/forms.html#h-17.13.4 In finden 17.13.4 Form content typesSie, wonach Sie suchen.
Andrew Barber
1
Siehe htmlcodetutorial.com/forms/form_enctype.html
David d C e Freitas
Mögliches Duplikat von Wie sollte eine mehrteilige HTTP-Anforderung mit mehreren Dateien aussehen?
Ciro Santilli 法轮功 冠状 病 六四 事件 7
Beim mehrteiligen Upload werden große Dateien stückweise hochgeladen. Beim Hochladen mehrerer Dateien werden viele kleine Dateien hochgeladen. Was fragst du?
Gangnus

Antworten:

126

BEARBEITEN : Ich behalte eine ähnliche, aber ausführlichere Antwort unter: https://stackoverflow.com/a/28380690/895245

Verwenden Sie nc -leinen ECHO-Server und einen Benutzeragenten wie einen Browser oder eine cURL , um genau zu sehen, was gerade passiert .

Speichern Sie das Formular in einer .htmlDatei:

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

Erstellen Sie Dateien zum Hochladen:

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

Lauf:

nc -l localhost 8000

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

ncdruckt die empfangene Anfrage. 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--

Alternativ sollte cURL dieselbe POST-Anfrage senden wie Ihr Browserformular:

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
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
41
Widerwärtig und nicht sofort offensichtlich Sachen: boundary=---------------------------9051914041544843365972754266sind zwei Bindestriche kürzer dann die tatsächlichen Grenzen der Daten. Das ist wirklich sehr, sehr schwer zu sehen, wenn alle Bindestriche aneinandergereiht sind.
Gefälschter Name
1
curl --trace-ascii <logfilename> ..... ist auch praktisch zum Anzeigen gesendeter und empfangener Daten.
Craig Hicks
curl -trace <logfilename> ....zeigt auch binär. Praktisch, um <LF> vs <CR> <LF> zu beobachten.
Craig Hicks
@FakeName - Diese Grenze wurde automatisch durch Curl erstellt.
Craig Hicks
6
Grenze ist immer - kürzer. Jedes MIME-Abschnitts-Trennzeichen (Begrenzung) enthält vorne zwei zusätzliche Bindestriche, und das Trennzeichen für die nachfolgende Grenze enthält vier zusätzliche Bindestriche: zwei vorne und zwei am Ende.
Sergey Kuznetsov
23

Vielen Dank an @Ciro Santilli Antwort! Ich fand, dass seine Wahl für die Grenze ziemlich "unglücklich" ist, weil alle diese Bindestriche: Wie @Fake Name kommentierte, werden bei der Verwendung Ihrer Boundary-Inside-Anfrage zwei weitere Bindestriche angezeigt:

Beispiel:

POST / HTTP/1.1
HOST: host.example.com
Cookie: some_cookies...
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text that you wrote in your html form ...
--12345
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz"

content of filename.xyz that you upload in your form with input[type=file]
--12345
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg"

content of picture_of_sunset.jpg ...
--12345--

Ich habe auf dieser w3.org-Seite festgestellt, dass es möglich ist, mehrteilige / gemischte Header in mehrteilige / Formulardaten einzuschließen, indem ich einfach eine andere Grenzzeichenfolge in mehrteiligen / gemischten Daten auswähle und diese zum Einkapseln von Daten verwende. Am Ende müssen Sie alle in FILO verwendeten Grenzen "schließen", um die POST-Anforderung zu schließen (wie:

POST / HTTP/1.1
...
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text sent via post...
--12345
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=abcde

--abcde
Content-Disposition: file; file="picture.jpg"

content of jpg...
--abcde
Content-Disposition: file; file="test.py"

content of test.py file ....
--abcde--
--12345--

Schauen Sie sich den obigen Link an.

pippo
quelle
1
Warum trennen Sie nicht alle Eigenschaften Content-Dispositionmit ;?
Kelin
1
'> e <ncapsulate'
Craig Hicks