はじめに
先日Expressでファイルダウンロードを処理する際に「マルチパートはー」と会話に出てきてついていけなかったので調査しました。その備忘録です。
ざっくりとマルチパートって?
multipart/form-data
のことだそうです。
いわゆるMIME TYPE
の一つで、HTTPヘッダーのContent-Type
に入れて使うことが多そうですね。
主な活用シートとしてはexcelファイルなどをアップロードするときに使うそうです。
MIME TYPEって?
MDNから引用すると
メディアタイプ (別名 Multipurpose Internet Mail Extensions または MIME タイプ) は、文書、ファイル、またはバイト列の性質や形式を示す標準です。 IETF の RFC 6838 で定義され、標準化されています。
のように定義されています。ようするにデータの型のような認識ですかね。ちなみにマイムタイプ
と呼ぶそうです。(ミメだと思ってた。。。)
MEME TYPEの形式は
タイプ/サブタイプ
の形式になっており、 タイプ
やサブタイプ
のみで構成されることはありません。
ex) application/json
multipart/form-data
MDNから引用すると
multipart/form-data タイプは、入力済みの HTML フォーム の内容をブラウザーからサーバーに送信するときに使用することができます。
これはマルチパート文書形式として複数の部分から成り、境界 (二重ダッシュ -- で始まる文字列) によって区切られます。それぞれの部分は固有のエンティティであり、固有の HTTP ヘッダーとして Content-Disposition やファイルアップロードのフィールドには Content-Type を持ちます。
このMIME TYPEはHTMLフォームからデータを送る際に使い。複数データをいっぺんに送ることが可能ということですね。
また、データそれぞれにMIMEを指定することができるそうです。
リクエストは以下のようになるそうです。
Content-Type: multipart/form-data; boundary=aBoundaryString
(マルチパート文書全体に関連付けられる、他のヘッダー)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(データ)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(データ)
--aBoundaryString
(サブパート)
--aBoundaryString--
--aaBoundaryString
はデータの境界を表しており、リクエストごとに変わります。
(サブパート)と書いてある部分はContent-typeなどとデータのまとまりを表しています。
おわりに
別の記事でExpressを使って具体的に説明できるようなもの作ってみたいと思います。