【Perl】ファイルアップロード 応用編 - [1]

Perlでのファイルアップロード:ファイルをサーバに保存

http://blogs.yahoo.co.jp/dk521123/11513644.html
で使ったファイルロードを応用して、
CSVファイルをアップロードし、そのファイルを読み込んで、更にファイルをアップロードできるシステムを作ってみた。(ややっこしい)

サンプルプログラム

index.cgi(Mainファイル)

#!C:/Perl/bin/perl

print "Content-type:text/html\n\n";

print << "END_OF_HTML";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="">http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SJIS" />
<title>Main -Management Page-</title>
<style type="text/css">
<!--
h1 {
font-size: x-large;
color:#ffffff;
background-color:#0000FF;
padding:5px;
font-weight:bold;
display:block;
border-left: 20px ridge #000099;
padding-left:3px;
height : 50px;
padding:4px 0px 0px 9px;
padding-top: 20px;
}

h2 {
padding:5px 0 5px 15px;
border-left:#6666FF 15px solid;
border-bottom:#666666 1px solid;
font-size: large;
font-weight: bold;
color:#333;
}
-->
</style>
</head>

<body>
<h1>管理メイン画面</h1>
<h2>管理者メニュー</h2>
<p>選択してください。</p>
<h3>システム管理</h3>
<ol>
  <li><a href="fileUpLoad1.cgi">CSVをアップロードする</a><br>
  <li><a href="fileUpLoad2.cgi">アップロードする</a><br>
  <li><a href="">CSVをアップロードする</a><br>
  <li><a href="">アップロードする</a><br>
  </li>
</ol>
<h3>管理</h3>
<ol>
  <li><a href="">CSVをアップロードする</a><br>
</ol>
</body>
</html>
END_OF_HTML

exit;

fileUpload1.cgi

#!C:/Perl/bin/perl


# To Define Message
# for en
#use constant MESSAGE_SUCCESS => "File Upload is successful!!";
#use constant MESSAGE_FAILED => "Failed to upload the file...";
#use constant MESSAGE_VALIDATION_ERROR1 => "Please Select a file...";
# For jp
use constant MESSAGE_SUCCESS => "アップロードが完了しました。";
use constant MESSAGE_FAILED => "アップロードに失敗しました。再試行してください。";
use constant MESSAGE_VALIDATION_ERROR1 => "ファイルを選択してください。";


use encoding "shift-jis";
use File::Basename qw(basename);
$myFilename = basename($0, '');
use CGI;


# To Output-1
print "Content-type:text/html\n\n";

print << "END_OF_HTML";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="">http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SJIS" />
<title>CSV File Upload -1-</title>
<style type="text/css">
<!--
h1 {
font-size: x-large;
color:#ffffff;
background-color:#0000FF;
padding:5px;
font-weight:bold;
display:block;
border-left: 20px ridge #000099;
padding-left:3px;
height : 50px;
padding:4px 0px 0px 9px;
padding-top: 20px;
}

h2 {
padding:5px 0 5px 15px;
border-left:#6666FF 15px solid;
border-bottom:#666666 1px solid;
font-size: large;
font-weight: bold;
color:#333;
}
-->
</style>
</head>

<body>
<h1>管理画面</h1>
<h2>CSVをアップロード</h2>
<p>アップロードするCSVファイルを選択し、「アップロード」ボタンをクリックしてください。</p>

END_OF_HTML

if ($ENV{'REQUEST_METHOD'} eq "POST") {
	$query = new CGI;
	
	# To Get File Name
	$filename = $query->param('fileName');
	
	# Validation for Form data
	if (length($filename) == 0) {
		# Form data is nothing...
		
		print "<div style='color:red' align='center'>" . MESSAGE_VALIDATION_ERROR1 . "</div>";
	} else {
		# Exist Form data
		
		# To Get MIME type
		$type = $query->uploadInfo($filename)->{'Content-Type'};
		
		# To Get File data
		while($bytesread = read($filename, $buffer, 2048)) {
			$file .= $buffer;
		}
		
		$filePath = "> ./data1/" . $filename;
		
		# To save the file
		open(OUT, $filePath) or die(MESSAGE_FAILED);
		binmode(OUT);
		print(OUT $file);
		close(OUT);
		
		# To display a message for saving successfully
		print "<div style='color:red' align='center'>" . MESSAGE_SUCCESS . "</div>";
	}
}

# To Output-2
print << "END_OF_HTML";
<form name="frm" method="post" action="/cgi-bin/Perl/$myFilename" enctype="multipart/form-data" value="選択">
<input type="file" name="fileName" size="60"><BR>
<input type="submit" name="submit" value="アップロード">
</form>
<div align='center'><a href="./index.cgi">管理メニューに戻る</a></div>
</body>
</html>
END_OF_HTML

exit;