CGIでのファイルの受信法 まず、HTMLの方は次のように記述します。
ENCTYPEの部分と、の部分に注目してください。 仮に、fooに"ABC"、baaに「file.jpg」というファイルを 送信した場合、CGIの方ではデータは次のような形で届きます。
行でMETHOD=POSTを指定していますので、このデータは 標準入力から取得できます。 ### begin ### Content-type: multipart/form-data, boundary=AaB03x --AaB03x content-disposition: form-data; name="foo" Content-Type: text/plain ABC --AaB03x content-disposition: form-data; name="baa"; filename="file.jpg" Content-Type: image/jpeg Content-Transfer-Encoding: binary ****** file.jpg の内容 **** --AaB03x-- ### end ### 初めの1行がデータのMIMEヘッダとなります。 MIMEヘッダにある、boundary=AaB03x の、AaB03xがデリミタになります。 デリミタは、ユーザー側のブラウザがランダムに生成します。 次の空行が、MIMEヘッダの終了を表します。 初めのMIMEヘッダが複数行にわたる可能性もありますので、(私はみた ことがありませんが)MIMEヘッダをスキップするには、MIMEヘッダの終了 を示す空行を検出した方がよいでしょう。 各データは、複数個数のハイフンの後に、デリミタが続いた行で区切られて います。 各データには、複数行のMIMEヘッダと、その終了を示す1行の空行が付随して います。 Content-disposition行から、INPUTタグのNAMEの名前や、ユーザが送ったファイ ルのファイルネーム(例えばfile.jpg)が取得できます。 またContent-Type行からは、データのMIMEタイプが取得できます。 デフォルトはtext/plainです。ファイルを送信した場合、image/jpegなどに なる場合がありますが、殆んどの場合ユーザー側のブラウザが拡張子や (Macの)ファイルタイプから判別したものなので、正しいという確証はあり ません。 Content-Transfer-Encoding行に、binaryと書かれている場合がありますが、 これは続くデータがバイナリデータであることを表しています。 また、データの終了は、複数個数のハイフンの後に、デリミタが続き、 その後にハイフン2つが続く文字列で表されます。 各データ行は、RFCによると CR/LFで区切られます。 詳しくは、RFCの1867番(Form-based File Upload in HTML)に書かれていま すので、そちらを参照ください。 http://ds.internic.net/rfc/rfc1867.txt