#!/usr/local/bin/perl
#======================================================================
# Name: WWWUPL
# Version: Ver2.11
# Category: Freesoft (再配布・改造自由)
# Contact: http://wakusei.cplaza.ne.jp/twn/
# Copyrignt (C) 1997,2000 とほほ
#======================================================================
#
# 使用方法
#
# (1) 通常のCGIとして設置してください。(CGI設置の知識を必要とします)
# (2) wwwupl.cgiの隣にwwwuplディレクトリ($upload_dirで変更可能)を作成
# してください。wwwuplディレクトリは、WEBサーバーが書き込めるよう
# な権限(パーミッション)を設定してください。
# (3) HTMLファイルから以下のように呼び出してください。
#
# (4) アップロードされたファイルは、wwwuplディレクトリに、$append_suffix
# で指定した拡張子付きで保存されます。$append_suffixを""にすると、
# 閲覧者が勝手に .cgi や .shtml のファイルを作成できてしまうので、
# セキュリティには充分注意してください。
# (5) 読み込んだデータをすべて、連続バッファに読み込むので、あまり大きな
# ファイルは転送できないかもしれません。
# (6) 16個以上同時にアップロードすることはできません。
#
# 履歴
# 1999/02/07 Ver2.00 初版
# 1999/02/14 Ver2.01 \r\nを含むバイナリ受信が失敗するバグを修正
# 1999/04/25 Ver2.02 ファイル名空欄時、form-data.uplができるバグを修正
# 1999/04/25 Ver2.10 TYPE=textなどのデータも受信できるようにした
# 2000/06/02 Ver2.11 muleのperl-mode対応 /(...$)/ -> /(...)$/
# カスタマイズパラメータ
$upload_dir = "wwwupl"; # アップロードファイルを格納するディレクトリ
$append_suffix = ".upl"; # ファイル名に追加する拡張子
# ページヘッダを書き出す
print "Content-type: text/html\n";
print "\n";
print "\n";
print "\n";
print "ファイルアップロード\n";
print "\n";
print "\n";
print "ファイルアップロード
\n";
print "
\n";
print "下記のファイルを受け取りました。\n";
print "\n";
# 標準入力からデータを読みだす
$buf = "";
$read_data = "";
$remain = $ENV{'CONTENT_LENGTH'};
binmode(STDIN);
while ($remain) {
$remain -= sysread(STDIN, $buf, $remain);
$read_data .= $buf;
}
# データを解釈する
$pos1 = 0; # ヘッダ部の先頭
$pos2 = 0; # ボディ部の先頭
$pos3 = 0; # ボディ部の終端
$delimiter = "";
$max_count = 0;
while (1) {
# ヘッダ処理
$pos2 = index($read_data, "\r\n\r\n", $pos1) + 4;
@headers = split("\r\n", substr($read_data, $pos1, $pos2 - $pos1));
$filename = "";
$name = "";
foreach (@headers) {
if ($delimiter eq "") {
$delimiter = $_;
} elsif (/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i) {
if ($3) {
$filename = $3;
if ($filename =~ /([^\\\/]+)$/) {
$filename = $1;
}
}
} elsif (/^Content-Disposition: ([^;]*); name="([^;]*)"/i) {
$name = $2;
}
}
# ボディ処理
$pos3 = index($read_data, "\r\n$delimiter", $pos2);
$size = $pos3 - $pos2;
if ($filename) {
print "- FILE: $filename($size Byte)\n";
if (open(OUT, "> $upload_dir/$filename$append_suffix")) {
binmode(OUT);
print OUT substr($read_data, $pos2, $size);
close(OUT);
}
} elsif ($name) {
$FORM{$name} = substr($read_data, $pos2, $size);
print "
- DATA: $name=$FORM{$name}\n";
}
# 終了処理
$pos1 = $pos3 + length("\r\n$delimiter");
if (substr($read_data, $pos1, 4) eq "--\r\n") {
# すべてのファイルの終端
last;
} else {
# 次のファイルを読み出す
$pos1 += 2;
if ($max_count++ > 16) { last; }
next;
}
}
# ページフッタを書き出す
print "
\n";
print "
\n";
print "[戻る]\n";
print "\n";
print "\n";