it-swarm.com.de

Was ist die Grenze bei mehrteiligen / Formulardaten?

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

Kann der Benutzer den ??? Frei definieren? Oder wird es aus dem HTML generiert? Kann ich den ??? = abcdefg Definieren?

341
Questions

Kann der Benutzer den ??? Frei definieren?

Ja.

oder wird es vom HTML geliefert?

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

Kann ich den ??? Als abcdefg definieren?

Ja.

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

name = John
age = 12

die Verwendung von application/x-www-form-urlencoded würde folgendermaßen aussehen:

name=John&age=12

Wie Sie sehen, weiß der Server, dass die Parameter durch ein kaufmännisches Und & Getrennt sind. Wenn für einen Parameterwert & Erforderlich ist, muss dieser codiert werden.

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

Verwenden Sie die 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-Type - Header an, damit der Server weiß wie er teilt, um welche Daten es sich handelt erhält.

Sie müssen also:

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

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

372
Oscar Mederos

Die genaue Antwort auf die Frage lautet: Ja, Sie können einen beliebigen Wert für den Parameter boundary verwenden, vorausgesetzt, er überschreitet 70 nicht Bytes lang und besteht nur aus 7-Bit US-ASCII (druckbaren) Zeichen.

Wenn Sie einen der Inhaltstypen multipart/* Verwenden, müssen Sie erforderlich den Parameter boundary im Header Content-Type Angeben, andernfalls den Der Server (im Fall einer HTTP-Anforderung) kann die Nutzdaten nicht analysieren.

Sie möchten wahrscheinlich auch den Parameter charset auf UTF-8 In Ihrem Content-Type - Header setzen, es sei denn, Sie können absolut sicher sein, dass nur US-ASCII Zeichensatz wird in den Nutzdaten verwendet.

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 beim Fehlen eines Zeichensatzparameters verwendet werden muss, ist US-ASCII.

  • 5.1. Multipart Media Type

    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 "binary" zulässig. Die "mehrteiligen" Begrenzungszeichen und Header-Felder werden in jedem Fall als 7-Bit-US-ASCII-Felder dargestellt (obwohl die Header-Felder nicht-US-ASCII-Header-Text gemäß RFC 2047 codieren können), und Daten innerhalb der Hauptteile können in a codiert werden Teil für Teil mit Content-Transfer-Encoding-Feldern für jeden entsprechenden Körperteil.

    Das Feld Inhaltstyp für mehrteilige Entitäten erfordert einen Parameter, "Grenze". Die Begrenzungslinie wird dann als eine Linie definiert, die vollständig aus zwei Bindestrichen ("-", Dezimalwert 45), gefolgt vom Grenzparameterwert aus dem Headerfeld "Content-Type", optionalem linearem Leerzeichen und einem abschließenden CRLF besteht.

    Begrenzungszeichen 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 unterscheidbarer Begrenzer, der angibt, dass keine weiteren Körperteile folgen werden. Eine solche Begrenzungslinie ist mit den vorherigen Begrenzungslinien identisch, wobei nach dem Grenzparameterwert zwei weitere Bindestriche eingefü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--
84
U-D13

multipart/Form-Daten enthalten Grenze, um Name/Wert-Paare zu trennen. Die Grenze fungiert als Markierung für jedes Stück Name/Wert-Paare, das beim Senden eines Formulars übergeben wird. Die Grenze wird automatisch zu einem Inhaltstyp eines Anforderungsheaders hinzugefügt.

Das Formular mit dem Attribut enctype = "multipart/form-data" hat einen Anforderungsheader. Content-Type: multipart/form-data; grenze --- WebKit193844043-h ( browser generated 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 Webserviceseite wird es in Form von @Consumes ("multipart/form-data") 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 Anhänge zu senden/form-data gibt einen Fehler aus, da die Begrenzung fehlt, da sie die Aufrollanforderung von post man an den Server mit dem Inhaltstyp überschreibt, indem die Begrenzung angehängt wird, die ordnungsgemäß funktioniert.

Siehe RFC1341, Abschnitt 7.2, Der mehrteilige Inhaltstyp

20
Yergalem