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


403

について質問したいmultipart/form-data。HTTPヘッダーで、Content-Type: multipart/form-data; boundary=???

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


2
これが答えだと思いました。w3.org/TR/html401/interact/forms.html#h-17.13.4.2
質問

回答:


424

ある???ユーザによって定義されて自由には?

はい。

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

いいえ。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データに表示されない値を使用してください。

  • 一貫性を保ち、リクエストメッセージのどこでも同じ値を使用します。


54
境界の最後に「-」を追加する必要はありません。
Sebastian Piskorski 2014年

13
ドキュメントで読むことができます。境界の末尾には、余分な2つのハイフ "-"が必要ですリンク:w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski 2014年

6
すばらしい答えです。境界は、マルチパートペイロードの複数の「パート」を分離するための単なる「キー」です。通常、「&」のようなもので変数を分離するのに十分ですが、ペイロード内でペイロードを分離するためにもっとユニークなものが必要です。
user2483724 14年

1
@ K3rnel31もちろん、新しい境界文字列の長さが同じでない限り。
オスカーメデロス2014

5
Content-Typeヘッダーで宣言されている境界値は実際には-XXX ---になると思います。これは、パーツを分離するときに余分な "-"を書き込む必要があるためです(つまり--- XXX ---)
Theodore K 。

96

質問に対する正確な答えは次のとおりです。はい、boundary長さが70バイトを超えず、7ビットUS-ASCII(印刷可能)文字のみで構成されていれば、パラメーターに任意の値を使用できます

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

おそらく、また、設定したいcharsetにパラメータをUTF-8あなたにContent-Typeあなたがすることができない限り、ヘッダー絶対に確認するだけでUS-ASCII文字セットがペイロード・データに使用されます。

RFC2046からのいくつかの関連する抜粋:

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

    他の一部のパラメーター値とは異なり、charsetパラメーターの値では大文字と小文字が区別されません。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フィールドには、「boundary」という1つのパラメーターが必要です。次に、境界区切り行は、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--

2
ハイフンの指定方法についてRFCから引用しているため、この回答が最も気に入っています。
リック

@Rick IETFが実行するために正当な理由がありますこと-であるが、それらはすべて見てほとんど同じ、以下の4つの一つだけが正しいハイフン文字です:˗ - - -
antichris

ハ、私がハイフンと言ったとき、あなたの答えはどのハイフンが規格で定義されているかを私に言ったことを意味します。どのハイフンが「クライアント定義」であり、どのハイフンが「仕様定義」であるかについて混乱しました
Rick

31

multipart / form-dataには、名前と値のペアを区切る境界が含まれています。境界は、フォームが送信されたときに渡される名前と値のペアの各チャンクのマーカーのように機能します。境界は、リクエストヘッダーのコンテンツタイプに自動的に追加されます。

フォームのenctype =「マルチパート/フォームデータ」属性は、要求ヘッダーのContent-Typeを有するであろう:マルチパート/フォームデータを、境界--- 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でサーバーへのポストマンのカールリクエストをオーバーライドするため、境界が欠落しているためです。

RFC1341 sec7.2 The Multipart Content-Typeを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.