web-dev-qa-db-ja.com

multipart / form-dataの境界は何ですか?

multipart/form-dataについて質問したいです。 HTTPヘッダーで、私はそれがContent-Type: multipart/form-data; boundary=???だとわかります。

???はユーザーが自由に定義できますか?それともHTMLから生成されますか? ??? = abcdefgを定義することは可能ですか?

330
Questions

???はユーザーが自由に定義できますか?

はい。

それともHTMLによって提供されますか?

No. HTMLなしそれをするために。以下を読んでください。

???abcdefgとして定義することは可能ですか?

はい。

次のデータをWebサーバーに送信したい場合は、

name = John
age = 12

application/x-www-form-urlencodedを使用すると、このようになります。

name=John&age=12

ご覧のとおり、サーバーはパラメーターがアンパーサンド&で区切られていることを認識しています。パラメータ値に&が必要な場合は、エンコードする必要があります。

では、multipart/form-dataを使用してHTTPリクエストを受信したときに、サーバーはどのようにしてパラメータ値の開始位置と終了位置を知るのでしょうか。

&と同様に、の境界を使用します。

例えば:

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

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

12
--XXX--

その場合、境界値はXXXです。サーバがどのように分割するかを受け取るようにサーバが知っているようにそれをContent-Typeヘッダで指定します。

だからあなたがする必要があります:

  • サーバーに送信されるHTTPデータに表示されない値を使用してください。

  • 一貫性を保ち、要求メッセージ内のあらゆる場所で同じ値を使用してください。

355
Oscar Mederos

質問に対する正確な答えは:はい、boundaryパラメーターに任意の値を使用できます(70バイトを超えない場合)長さは 7-bit US-ASCII (印刷可能)文字のみで構成されます。

multipart/*コンテンツタイプの1つを使用している場合、実際にはrequiredで、Content-Typeヘッダーのboundaryパラメーターを指定します。そうでない場合は、サーバー(HTTPの場合リクエスト)はペイロードを解析できません。

absolutely確実にUTF-8 charsetのみがペイロードデータで使用される場合を除き、Content-TypeヘッダーでcharsetパラメーターをUS-ASCIIに設定することもできます。

RFC2046 からの関連する抜粋:

  • 4.1.2。文字セットパラメータ:

    他の一部のパラメーター値とは異なり、charsetパラメーターの値では大文字と小文字が区別されません。文字セットパラメータがない場合に想定されるデフォルトの文字セットはUS-ASCIIです。

  • 5.1。マルチパートメディアタイプ

    Content-Transfer-Encodingフィールド[RFC 2045]の定義で述べられているように、タイプ "multipart"のエンティティには、 "7bit"、 "8bit"、または "binary"以外のエンコーディングは許可されません。 「マルチパート」境界区切り文字とヘッダーフィールドは、常に7ビットUS-ASCIIとして表され(ヘッダーフィールドはRFC 2047に従って非US-ASCIIヘッダーテキストをエンコードする場合があります)、本文部分内のデータは各適切な身体部位のContent-Transfer-Encodingフィールドを使用した、部位ごとの基礎。

    マルチパートエンティティのContent-Typeフィールドには、パラメータ「境界」が必要です。境界デリミタ行は、2つのハイフン文字( "-"、10進数値45)から成り、その後にContent-Typeヘッダーフィールドからの境界パラメータ値、オプションの線形空白、および終了CRLFが続く行として定義されます。

    境界デリミタは、カプセル化されたマテリアル内に表示されてはならず、2つの先頭のハイフンをカウントせずに、70文字以下でなければなりません。

    最後のボディ部分に続く境界区切り線は、それ以降のボディ部分が続かないことを示す区別された区切り文字です。このような区切り線は、境界パラメーター値の後にさらに2つのハイフンが追加されている点を除いて、前の区切り線と同じです。

任意の境界を使用した例を次に示します。

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-dataには、名前と値のペアを区切るための境界が含まれています。境界は、フォームが送信されたときに渡される名前/値ペアの各チャンクのマーカーのように機能します。境界は自動的にリクエストヘッダのcontent-typeに追加されます。

enctype = "multipart/form-data"属性を持つフォームには、リクエストヘッダーContent-Type:multipart/form-dataがあります。境界--- WebKit193844043-h(ブラウザが値を生成しました)。

渡されたペイロードは次のようになります。

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

Webサービス側では@Consumes( "multipart/form-data")形式で消費されます。

Chrome postmanを使ってWebサービスをテストするときは、添付ファイルを送信するためにドロップダウンボックスからフォームデータオプション(ラジオボタン)とファイルメニューをチェックする必要があります。 multipart/form-dataとしてcontent-typeを明示的に指定するとエラーが発生します。正常に動作する境界を追加することで、content-typeを持つサーバーへのpost manのcurl要求をオーバーライドするので、境界がないためです。

RFC1341 sec7.2マルチパートContent-Type を参照してください。

18
Yergalem