Was ist die Grenze in mehrteiligen / Formulardaten?

403

Ich möchte eine Frage zum stellen multipart/form-data. Im HTTP-Header finde ich, dass die Content-Type: multipart/form-data; boundary=???.

Soll das ???freie vom Benutzer definiert werden? Oder wird es aus dem HTML generiert? Kann ich das definieren ??? = abcdefg?

Fragen
quelle

Antworten:

424

Soll das ???freie vom Benutzer definiert werden?

Ja.

oder wird es vom HTML geliefert?

Nr HTML hat nichts damit zu tun. Lesen Sie unten.

Kann ich das ???als definieren abcdefg?

Ja.

Wenn Sie die folgenden Daten an den Webserver senden möchten:

name = John
age = 12

Verwenden application/x-www-form-urlencodedwäre wie folgt:

name=John&age=12

Wie Sie sehen können, weiß der Server, dass die Parameter durch ein kaufmännisches Und getrennt sind &. Wenn &ein Parameterwert erforderlich ist, muss er codiert werden.

Woher weiß der Server, wo ein Parameterwert beginnt und endet, wenn er eine HTTP-Anforderung mit empfängt multipart/form-data?

Verwenden der Grenze , ähnlich wie &.

Zum Beispiel:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

In diesem Fall ist der Grenzwert XXX. Sie geben es im Content-TypeHeader an, damit der Server weiß, wie die empfangenen Daten aufgeteilt werden.

Sie müssen also:

  • Verwenden Sie einen Wert, der in den an den Server gesendeten HTTP-Daten nicht angezeigt wird.

  • Seien Sie konsistent und verwenden Sie überall in der Anforderungsnachricht denselben Wert.

Oscar Mederos
quelle
54
Sie müssen am Ende der Grenze ein zusätzliches "-" hinzufügen.
Sebastian Piskorski
13
Sie können es in der Dokumentation lesen. Grenzende müssen zwei zusätzliche Hypens haben "-" Link: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski
6
Gute Antwort. Eine Grenze ist nur der 'Schlüssel', um die mehreren "Teile" einer mehrteiligen Nutzlast zu trennen. Normalerweise reicht etwas wie '&' aus, um die Variablen zu trennen, aber Sie benötigen etwas Einzigartigeres, um die Nutzdaten innerhalb der Nutzdaten zu trennen.
user2483724
1
@ K3rnel31 Natürlich, es sei denn, die neue Begrenzungszeichenfolge hat dieselbe Länge.
Oscar Mederos
5
Ich denke, dass der Grenzwert, wie er im Content-Type-Header deklariert ist, tatsächlich -XXX --- ist, da beim Trennen der Teile ein zusätzliches "-" geschrieben werden sollte (daher das --- XXX ---)
Theodore K. . ,
96

Die genaue Antwort auf die Frage lautet: Ja, Sie können einen beliebigen Wert für den boundaryParameter verwenden , da dieser nicht länger als 70 Byte ist und nur aus 7 Bit bestehtUS-ASCII Zeichen (druckbar) besteht.

Wenn Sie eines verwenden multipart/*Inhaltstypen, sind Sie tatsächlich erforderlich , die angeben , boundaryParameter in derContent-Type Kopfzeile, da sonst der Server (im Fall einer HTTP - Anforderung) nicht in der Lage sein , um die Nutzlast zu analysieren.

Sie möchten den charsetParameter wahrscheinlich auch UTF-8in Ihrem Content-TypeHeader auf setzen, es sei denn, Sie können absolut sicher sein, dass nur diesUS-ASCII Zeichensatz in den Nutzdaten verwendet wird.

Einige relevante Auszüge aus dem RFC2046 :

  • 4.1.2. Zeichensatzparameter:

    Im Gegensatz zu einigen anderen Parameterwerten wird bei den Werten des Zeichensatzparameters NICHT zwischen Groß- und Kleinschreibung unterschieden. Der Standardzeichensatz, der ohne Zeichensatzparameter angenommen werden muss, ist US-ASCII.

  • 5.1. Mehrteiliger Medientyp

    Wie in der Definition des Felds "Content-Transfer-Encoding" [RFC 2045] angegeben, ist für Entitäten vom Typ "Multipart" keine andere Codierung als "7bit", "8bit" oder "binär" zulässig. Die "mehrteiligen" Grenzbegrenzer und Headerfelder werden in jedem Fall immer als 7-Bit-US-ASCII dargestellt (obwohl die Headerfelder möglicherweise Nicht-US-ASCII-Headertext gemäß RFC 2047 codieren), und Daten innerhalb der Körperteile können auf a codiert werden Teil für Teil mit Feldern für die Inhaltsübertragungscodierung für jedes geeignete Körperteil.

    Das Feld Inhaltstyp für mehrteilige Entitäten erfordert einen Parameter, "Grenze". Die Begrenzungsbegrenzungszeile wird dann als eine Zeile definiert, die vollständig aus zwei Bindestrichen ("-", Dezimalwert 45) besteht, gefolgt vom Begrenzungsparameterwert aus dem Headerfeld "Inhaltstyp", einem optionalen linearen Leerzeichen und einer abschließenden CRLF.

    Begrenzungsbegrenzer dürfen nicht im eingekapselten Material enthalten sein und dürfen nicht länger als 70 Zeichen sein, wobei die beiden führenden Bindestriche nicht berücksichtigt werden.

    Die Begrenzungslinie nach dem letzten Körperteil ist ein unterschiedliches Trennzeichen, das angibt, dass keine weiteren Körperteile folgen. Eine solche Begrenzerlinie ist identisch mit den vorherigen Begrenzerlinien, wobei nach dem Grenzparameterwert zwei weitere Bindestriche hinzugefügt werden.

Hier ist ein Beispiel mit einer beliebigen Grenze:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--
Antichris
quelle
2
Diese Antwort gefällt mir am besten, weil sie aus RFC zitiert, wie Bindestriche angegeben werden.
Rick
@Rick Es gibt einen triftigen Grund für die IETF, dies zu tun - obwohl sie alle ziemlich gleich aussehen, ist nur einer der folgenden vier der richtige Bindestrich: ˗ - - -
antichris
ha, als ich Hypens sagte, meine ich, Ihre Antwort hat mir gesagt, welche Hypens im Standard definiert sind. Ich war verwirrt darüber, welche Hypens "Client Defined" und welche "Specification Defined" sind
Rick
31

Multipart / Formulardaten enthalten Grenzen zu getrennten Name / Wert-Paaren. Die Grenze fungiert als Markierung für jeden Teil der Namen / Wert-Paare, die beim Senden eines Formulars übergeben werden. Die Grenze wird automatisch zu einem Inhaltstyp eines Anforderungsheaders hinzugefügt.

Das Formular mit dem Attribut enctype = "multipart / form-data" hat einen Anforderungsheader. Inhaltstyp: multipart / form-data; Grenze --- WebKit193844043-h ( Browser generiert vaue ).

Die übergebene Nutzlast sieht ungefähr so ​​aus:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

Auf der Webservice-Seite wird es in Form von @Consumes ("Multipart / Formulardaten") verwendet.

Beachten Sie, dass Sie beim Testen Ihres Webservices mit Chrome Postman die Option Formulardaten (Optionsfeld) und das Menü Datei im Dropdown-Feld aktivieren müssen, um den Anhang zu senden. Die explizite Angabe des Inhaltstyps als mehrteilige / Formulardaten löst einen Fehler aus. Da die Grenze fehlt, wird die Curl-Anforderung von Postman an den Server mit Inhaltstyp überschrieben, indem die Grenze angehängt wird, die einwandfrei funktioniert.

Siehe RFC1341, Abschnitt 7.2. Der mehrteilige Inhaltstyp

Yergalem
quelle