フォームデータの取扱い

戻る

CGI呼び出しに「POST」メソッドを使った場合、「Environ("CONTENT_LENGTH")」と「Environ("CONTENT_TYPE")」に送られたデータに関する情報が入る。前者はデータの長さであり、後者はデータのタイプを意味する。データの長さに応じて標準入力からデータそのものを受け取り、タイプに応じての処理を加える。タイプが「application/x-www-form-urlencoded」であれば、受け取ったデータはクエリー文字列と同じ形式になっている(URLエンコードされている)。タイプが「multipart/form-data; 〜」となっていると、MIME形式でデータが送られていることになる。例えば、ファイルをアップロードさせた場合は、MIME形式でデータが送られてくる。

MIMEデータの扱いは結構面倒で、詳細を説明すると大変なことになるので、概要のみを紹介しておく。まず、CONTENT-TYPEから、「boundary=」を見つける。このイコール記号より後ろ、カンマまでの文字列がマルチパートの区切りである。ポストされた文字列から、この区切り文字列を探していき、区切り文字列の直後に示される各パートのヘッダを確認する。このヘッダ部には、ファイルであれば「filename=」が、テキストであれば「name=」が存在する。ファイルの場合は、ヘッダにある属性を確認しつつ、データ内容を取り出し、目的のファイルとして保存していく。

MIMEの扱いには筆者も自信がないこともあるし、複雑(もしくは面倒)なので割愛させて頂く。少なくとも筆者が Trial&Error(いきあたりばったり)でプログラムを組んだ結果、正しい結果を得た経験はあるので、決して不可能ではない。MIMEの話は追求を勘弁してもらい、通常のテキストデータをPOSTした場合の処理に戻ろう。

データがPOSTで送られた場合は、そのデータの長さに応じて、標準入力を使って内容を取り込む。しかる後、そのデータタイプに基づいての加工と処理を行う。データはクエリー文字列と同じものだと考えて扱ってしまって良いので、クエリー文字列を処理する関数やサブルーチンが活用できる。サーバー運用上、クエリー文字列とPOSTデータとの相違は、URLに表示されるかどうかと、制限される長さがどれだけか、ということだと考えておけばいい。

実は、クエリー文字列のデコードでは端折ってしまったことがある。賢明な方なら気付いているであろうが、漢字コードの取扱いだ。クエリー文字列もそうだが、ポストされたテキストに関しても、漢字コードを判別し、統一しなければならないわけである。コードはJIS/EUC/SJISのいずれかであろうが、これら3種のいずれかであるかを自動判別し、扱うべきコード(VBなら、SJISになりますね)に変換することが必要となる。例によって、関数にでもするしかないようだ。これもまた、ここでは割愛するので、別途調査して欲しい。(最近のブラウザは、表示しているページの文字コードを利用してFORM内容を送出してくれるらしい。IISベースなら普通はSJISでページを送り出しているだろうから、FORMメソッドでPOSTされてくる内容もSJISであると期待して良いようだ)

割愛しまくったら、書く事が無くなってしまった。いずれ折りを見て説明を加筆することもあるかもしれない。(実際、ちょっとしたのだけれど)

なお、POSTされる情報は、プログラム作成者が作るか指定することになると別項でも述べたが、実はそれだけでもないケースはありえる。POSTするためのHTMLが別のWWWサーバ上に書かれることも全く無いとは言えないのだ。もしそういう事があった場合にも対応できるよう、プログラム上で注意を払うことを奨める。だからと言って、MIMEに対応する必要があるとまでは言わないが。