ファイルアップロード (module)CGI

back
(なんか Perl の話じゃないけど)
HTML フォームの enctype="multipart/form-data" でフォームを作成、サーバへ
ファイルの内容を送信できるようにする。

プログラム側では普通の CGI と同様に、クライアントからのデータは
標準入力を読み込んで取得する。
その際の形式は

-------- boundary 文字列
Content-Disposition: form-data; name="フォームのキー名"; filename="ファイル名"
Content-Type: コンテントタイプ名

以下データ
:
:
:
-------- boundary 文字列


と、マルチパートメールとほぼ同じ構成。パート内の最初の空行以降をうまく内容を読んでくれ。
boundary については、メールと同じように、環境変数 CONTENT_TYPE から取得可能
($ENV{CONTENT_TYPE} が "multipart/form-data; boundary=HOGEHOGE" となっている)
メールと違うのは Base64 等でエンコードされてはいないので、該当箇所をそのまま read
して別ファイルに print してやれば OK

CGI モジュールを使う場合は、モジュールが勝手にいろいろやってくれるので便利。

----
use CGI;

my $q = new CGI;
my $file = $q->param('file');    # フォームのキー名が file の場合ね

# この時点で、$file にファイル名が格納されると同時に、そのデータに
# アクセスするためのファイルハンドルにもなる

open(F, "> outputfile") or die "error: $!";
while (<$file>) {
  print F;
}
close(F);
----
見たいな感じで。
(かなりテキトー)

ただし、取得できるファイル名については、ブラウザ依存でフルパスだったり
ファイル名だけだったりするので、そのまま出力ファイル名に使いまわすのオススメしない。

back