iPhone からサーバーにファイルをアップロードしようとしています。Apple 製ではないライブラリの使用を避けようとしていますが、リクエストの作成にはかなり低レベルの作業が必要になるようです。multipart/form-data リクエストの「境界」とは何か、またそれを適切に使用する方法を教えてもらえますか?
1 に答える
境界は、クライアントが投稿されるフォームのフィールドを区切るために使用する任意のテキストです。Content-type
クライアントは、ヘッダーの一部として使用している境界を宣言します。
HTML RFCの IETF Form-based File Upload から:
どのデータにも出現しない境界が選択されます。(この選択は、確率論的に行われることがあります。) フォームの各フィールドは、フォーム内で発生する順序で、マルチパート ストリームの一部として送信されます。各部分は、元の HTML フォーム内の INPUT 名を識別します。メディア タイプがわかっている場合 (たとえば、ファイル拡張子またはオペレーティング システムの入力情報から推測される場合)、またはアプリケーション/オクテット ストリームとして、各部分に適切なコンテンツ タイプのラベルを付ける必要があります。
...
6. 例
サーバーが次の HTML を提供するとします。
<FORM ACTION="http://server.dom/cgi/handle" ENCTYPE="multipart/form-data" METHOD=POST> What is your name? <INPUT TYPE=TEXT NAME=submitter> What files are you sending? <INPUT TYPE=FILE NAME=pics> </FORM>
ユーザーは名前フィールドに「Joe Blow」と入力し、「送信するファイルは何ですか?」に対する回答としてテキスト ファイル「file1.txt」を選択します。
クライアントは次のデータを送り返す場合があります。
Content-type: multipart/form-data, boundary=AaB03x --AaB03x content-disposition: form-data; name="field1" Joe Blow --AaB03x content-disposition: form-data; name="pics"; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --AaB03x--
ユーザーが「送信するファイルは何ですか?」に対する回答として画像ファイル「file2.gif」も指定した場合、クライアントは次のデータを返す可能性があります。
Content-type: multipart/form-data, boundary=AaB03x --AaB03x content-disposition: form-data; name="field1" Joe Blow --AaB03x content-disposition: form-data; name="pics" Content-type: multipart/mixed, boundary=BbC04y --BbC04y Content-disposition: attachment; filename="file1.txt"
最初の例では、境界は固定文字列AaB03x
です。2 番目の例では、最初に境界がAaB03x
あり、次に に切り替わりますBbC04y
。