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

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



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 "file1=@a.html" -F "file1=@a.txt" localhost:8000

Sie können mehrere Tests durchführen mit:

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

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.


1
Warum trennen Sie nicht alle Eigenschaften Content-Dispositionmit ;?
Kelin

1
'> e <ncapsulate'
Craig Hicks
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.