Internet ExplorerやNetscape Navigator/Communicatorなどの一部のブラウザでは、フォームからファイルの内容を送信するファイルアップロードをサポートしています。
ファイルアップロードを要求するページでは、formタグのenctypeアトリビュートにmultipart/form-dataを指定します。methodは必ずpostを使います。また、ファイルを取り込むフォームとして、inputタグのtypeアトリビュートにfileを指定します。
ファイルアップロードのフォームはブラウザによって若干異なりますが、ファイル名を入力するボックスと、「参照」ボタンが表示されるのが一般的です。「参照」ボタンを選択するとブラウザ側のホストのディスク内容が表示されるので、送信したいファイルを選びます。入力ボックスには選択したファイルのパス名が入ります。
標準入力に入る送信データを扱うのは少々難しいのですが、CGI.pmではこのプロセスをかなり簡単にしてくれます。
次のPerlスクリプトでは、postfileという変数(<input type="file" name="postfile">で指定したもの)に入ったファイルをブラウザ画面に表示します。行番号は説明のためにつけたものです。
#!/usr/bin/perl 1:use CGI; 2:$query = new CGI; 3: 4:print "Content-type: text/plain\n\n"; 5: 6:$filename = $query->param('postfile'); 7:$type = $query->uploadInfo($filename)->{'Content-Type'}; 8: 9:print "[$filename]\n\n"; 10: 11:if ($type =~ /^text\//) { 12: while (<$filename>) { 13: print $_; 14: } 15:} else { 16: print "このファイルはテキストではないので表示できません。\n"; 17:}
例では単にファイルの内容を表示するだけに留めましたが、12行目〜14行目のスクリプトを変更すれば、Webサーバー上のローカルディスクに保存することも可能です。この場合、保存するディレクトリにはWebサーバーの代理ユーザーが書き込める権限(16.4 参照)が必要です。