Perlでファイルアップロード

Perlでアップロードファイルを受け取る時の最小よりちょっと色々おまけが付いてるコード。

post.cgi

UTF-8で記述。

#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use CGI;
use File::Copy;
use File::Basename;

&main();

sub main{
	# CGIオブジェクト
	my $cgi = new CGI;
	
	# アップロードディレクトリ
	my $updir = './upload';
	
	# アップロードファイルのハンドル
	my $fh = $cgi->upload('filename');
	
	# 一時ファイルの場所
	my $tmpPath = $cgi->tmpFileName($fh);
	
	# オリジナルのファイル名
	my $filename = File::Basename::basename($fh);
	utf8::decode($filename);
	
	# MIME TYPEの取得
	my $mimetype = $cgi->uploadInfo($fh)->{'Content-Type'};
	
	# ユニークなファイル名で保存。
	$filename =~ m{(\.[\w]+)$};
	my $saveName = $updir.'/'.time().$1;
	
	# 保存
	File::Copy::move($tmpPath, $saveName) or &fail();
	chmod(0644, $saveName);
	
	# 完了画面
	&success($saveName, $filename, $mimetype);

	close($fh);
	
	return 0;
}

sub success{
	my($saveName, $filename, $mimetype) = @_;
	my $out = <<VIEW;
<html>
	<head>
		<title>アップロード完了</title>
	</head>
	<body>
		<table>
			<tr>
				<td>保存ファイル名</td>
				<td>$saveName</td>
			</tr>
			<tr>
				<td>アップロード前ファイル名</td>
				<td>$filename</td>
			</tr>
			<tr>
				<td>MIME TYPE</td>
				<td>$mimetype</td>
			</tr>
			<tr>
				<td>ビュー</td>
				<td><img src="$saveName"></td>
			</tr>
		</table>
	</body>
</html>
VIEW
	utf8::encode($out);
	print "Content-Type: text/html\n\n", $out;
}

sub fail{
	my $out = <<VIEW;
<html>
	<head>
		<title>アップロード完了</title>
	</head>
	<body>
		<p>アップロードに失敗。</p>
	</body>
</html>
VIEW
	utf8::encode($out);
	print "Content-Type: text/html\n\n", $out;
}

post.html

UTF-8で記述。

<html>
	<head>
		<title>テストアップローダ</title>
	</head>
	<body>
		<h1>テストアップローダ</h1>
		<form action="./post.cgi" method="POST" enctype="multipart/form-data">
			<input type="file" name="filename">
			<input type="submit" value="UPLOAD">
		</form>
	</body>
</html>