multipart/form-data(マルチパート・フォーム・データ)とは | 意味や読み方など丁寧でわかりやすい用語解説
multipart/form-data(マルチパート・フォーム・データ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
マルチパート・フォームデータ (マルチパート・フォームデータ)
英語表記
multipart/form-data (マルチパートフォームデータ)
用語解説
「multipart/form-data」は、WebブラウザからWebサーバーへデータを送信する際に用いられるデータ形式の一つである。特に、ユーザーがWebフォームを通じてファイル(画像、文書、動画など)をアップロードする場合に必須となる技術で、一般的なテキストデータだけでなく、バイナリデータであるファイルの内容を効率的かつ正確にサーバーに送るために設計されている。
通常、HTMLフォームからデータを送信する際、デフォルトのエンコード方式として「application/x-www-form-urlencoded」が用いられる。この方式では、すべてのフォームデータがURLエンコードされ、キーと値のペアが&で連結されて送信される。例えば、「name=太郎&age=30」のような形式である。しかし、この方式でファイルを送信しようとすると、ファイルの内容(バイナリデータ)をすべてURLエンコードする必要があり、非常に非効率的でデータ量が増大する問題や、文字コードの問題でデータが破損する可能性があった。このような問題を解決するために登場したのが「multipart/form-data」である。
「multipart/form-data」は、HTMLの<form>タグのenctype属性に"multipart/form-data"と指定することで利用される。これにより、Webブラウザはフォームのデータを、この特別な形式でHTTPリクエストのボディに含めてサーバーへ送信する。サーバー側では、このContent-Typeヘッダを見て、データがmultipart/form-data形式であることを認識し、適切な方法で解析を開始する。
この形式の最大の特徴は、その名の通り「multipart」(複数の部分)である点にある。一つのHTTPリクエストの中に、複数の異なる種類のデータをまとめて送信できる構造を持つ。各データは「境界文字列(boundary string)」と呼ばれる一意の文字列によって区切られる。この境界文字列は、リクエストのContent-Typeヘッダに記述され、例えば「Content-Type: multipart/form-data; boundary=----------WebKitFormBoundaryAbC123XyZ」のように、ブラウザが自動的に生成するランダムな文字列となる。この文字列は、データ本体と混同されないように十分にユニークなものである必要がある。
具体的なデータ構造を見てみよう。HTTPリクエストのボディは、まず最初に境界文字列で始まり、その後に続く各データパートがこの境界文字列で区切られていく。各データパートは、それぞれ独自のヘッダとデータ本体を持つ。
データパートのヘッダには、主に「Content-Disposition」と「Content-Type」が含まれる。「Content-Disposition: form-data; name="フィールド名"」は、そのパートがフォームのどのフィールド(入力欄)に対応するデータであるかを示す。例えば、テキスト入力フィールドであればname="username"、ファイルアップロードフィールドであればname="profile_image"といった具合である。ファイルアップロードの場合には、さらにfilename="ファイル名.jpg"のように元のファイル名も追加される。
そして「Content-Type」ヘッダは、そのデータパートがどのような種類のデータであるかを示す。テキストデータであればContent-Type: text/plainが用いられることが多いが、ファイルデータであれば、そのファイルのMIMEタイプ(例: image/jpeg、application/pdf、video/mp4など)が指定される。もしMIMEタイプが不明な場合はapplication/octet-streamが指定されることもある。このMIMEタイプによって、サーバーは受信したファイルデータを適切に処理するためのヒントを得る。これらのヘッダの後に空行が続き、その後に実際のデータ本体(テキスト値やバイナリファイルの内容)が続く。
すべてのデータパートが送信された後には、最後に境界文字列の末尾に--を付加した「終了境界文字列」(例: --WebKitFormBoundaryAbC123XyZ--)が置かれ、データ送信の終了を示す。この構造により、サーバーは受信したデータストリームから、境界文字列をマーカーとして各フィールドのデータやファイルデータを正確に分離・抽出できる。
ファイルアップロードにおいて「multipart/form-data」が優れている点は、バイナリデータをそのままの形式で送信できることにある。application/x-www-form-urlencodedのようにエンコードする必要がないため、データのサイズが不必要に増大せず、またエンコード・デコード処理の負荷も低減される。これにより、大きなファイルでも効率的に、かつデータ破損のリスクを最小限に抑えてアップロードすることが可能となる。サーバーサイドでは、このデータ形式を解析するためのライブラリやフレームワークが提供されており、開発者は比較的容易にファイルアップロード機能を実装できる。例えば、PHPの$_FILESスーパーグローバル変数や、JavaのServlet API、Node.jsのExpressフレームワークとMulterなどのミドルウェアがこの処理を担う。
利用シーンは多岐にわたる。ウェブサイトでのプロフィール画像設定、業務システムでの書類やレポートのアップロード、ソーシャルメディアでの写真や動画の投稿、ウェブメールにおける添付ファイルの送信など、現代のWebアプリケーションではファイルデータの送受信が不可欠であり、そのほとんどの場面で「multipart/form-data」が裏側で機能している。この技術は、Webアプリケーションが単なるテキストベースのやり取りを超え、リッチなコンテンツを扱うことを可能にした基盤技術の一つと言えるだろう。