multipart/form-data
について質問したいです。 HTTPヘッダーで、私はそれがContent-Type: multipart/form-data; boundary=???
だとわかります。
???
はユーザーが自由に定義できますか?それともHTMLから生成されますか? ??? = abcdefg
を定義することは可能ですか?
???
はユーザーが自由に定義できますか?
はい。
それとも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データに表示されない値を使用してください。
一貫性を保ち、要求メッセージ内のあらゆる場所で同じ値を使用してください。
質問に対する正確な答えは:はい、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--
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 を参照してください。