''[[FrontPage]]''
* 自作ファイルアップローダのHTML出力部 [#t3b83150]
実際に作成したソースコードを公開します。~
掲示板と同様、機能の観点でファイルを2つに分けています。~
それぞれ、表(HTML出力部: dfh.cgi)と裏(ログファイル作成部: write.cgi)といったかたちで。~
ここではログの読込みとHTML出力に特化したdfh.cgiを、コメント中にて解説しています。~
~
ポイントは、formタグでenctype="multipart/form-data"を記述していることです。~
これにより、フォームデータの形式が大きく変わります。~
~
ファイル名: dfh_r2.cgi
#!/usr/bin/perl
use warnings; # 警告表示 #
use strict; # 構文チェック #
# #
require './jcode.pl'; # for Shift-Jis #
# #
# Read Cookie *************************************************## Cookieの内容を読込む #
my $cv = ""; # クッキーのデータ行を格納する #
my $cname = ""; # クッキーに保存された名前 #
my $curl = ""; # クッキーに保存されたURL #
my $cmssid = ""; # クッキーに保存されたID #
my $nouse = ""; # ゴミデータの処理 #
# #
$cv = $ENV{'HTTP_COOKIE'}; # (あなたの)環境変数, クッキーの内容を変数に読込む #
# #
($cname, $curl, $cmssid, $nouse) = split( /#@#/, $cv ); # クッキーの内容を各変数に格納 #
# #
unless( defined $cmssid || $cmssid ne "" ) # 入力IDが未定義または空白かどうか #
{ # 入力IDが未定義または空白の場合 #
$cmssid = 1; # デフォルトで"1" #
} # #
#/Read Cookie *************************************************## #
# Read Log ****************************************************## ログファイルを読込む #
my @reada = (""); # ログファイルの内容を格納する #
# #
open( LOGR, "<./filelog.txt" ) # ログファイルをオープン #
or print "Location: http://bj006.com/cgi/error2.htm"."\n\n"; # 失敗時はエラーページ2(内部エラー)へジャンプ #
flock( LOGR, 1 ) # 共有ロック #
or print "Location: http://bj006.com/cgi/error2.htm"."\n\n"; # 失敗時はエラーページ2(内部エラー)へジャンプ #
@reada = <LOGR>; # ログファイルの内容を行ごとに配列に格納 #
close LOGR; # ファイルクローズ #
#/Read Log ****************************************************## #
# HTML Front **************************************************## HTML前半部出力 #
print 'Content-type: text/html'."\n\n"; # HTML出力 #
# #
print <<HF; # HTML出力 複数行 #
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>uploader</title>
</head>
<body bgcolor="#B8A470" link="#0099FF" vlink="#999999" alink="#FFFF99">
<p align="left">
<font size="+7" face="Times New Roman, Times, serif">
<strong>bj006.com File Uploader</strong>
</font>
<font size="3"><br></font>
</p>
<form action="./write.cgi" method="POST" enctype="multipart/form-data"> <!-- 入力フォーム(POST)の開始 write.cgiへ-->
<div align="left">
<table width="21%" border=" " bordercolor="#B8A470">
<tr>
<td width="20%">Name:</td> <!-- 入力フォーム: 名前 -->
<td colspan="2">
<input name="name" type="text" size="25" maxlength="20" value="$cname"> <!-- cookieから なければ空白 -->
</td>
</tr>
<tr>
<td>Comment:</td> <!-- 入力フォーム: コメント -->
<td colspan="2"><input name="comment" type="text" maxlength="20" size="25"></td>
</tr>
<tr>
<td>File:</td> <!-- 入力フォーム: ファイル -->
<td colspan="2"><input name="file" type="file" size="25"></td>
</tr>
<tr>
<td height="2">Password: </td> <!-- 入力フォーム: 投稿パスワード -->
<td width="9%" height="2">
<input name="pwd" type="password" size="8" maxlength="8" value="">
</td>
</tr>
<tr>
<td height="2">URL:</td> <!-- 入力フォーム: URL -->
<td height="2" colspan="2">
<input name="url" type="text" value="$curl" size="25"> <!-- cookieに保存されたURL なければ空白 -->
</td>
</tr>
<tr>
<td height="2">ID: </td> <!-- 入力フォーム: ID -->
<td width="9%" height="2">
<input name="mssid" type="text" size="4" maxlength="4" value="$cmssid"> <!-- cookieのID or 空白 -->
</td>
<td width="71%" height="2">(input 1-1024) </td>
</tr>
<tr>
<td height="7"></td>
<td height="7" colspan="2">
<input type="submit" name="Upload" value="upload"> <!-- 入力フォーム: 投稿ボタン -->
</td>
</tr>
</table>
</div>
</form> <!-- 入力フォーム ここまで -->
<p align="left"> <!-- リンク -->
<a href="http://bj006.com">
<font size="2">
<span style="background-color: #000000">-HOME-</span>
</a>
<a href="http://bj006.com/cgi/aboutuploader">
<span style="background-color: #000000">
このアップローダについての説明
</span>
</font>
</a>
</p>
<table width="75%" border="" bordercolor="#B8A470"> <!-- HTML前半部出力終了 ログ部テーブルタグ前 -->
HF
#/HTML Front **************************************************## #
# Query *******************************************************## クエリ判定部 #
my $qkey = ""; # クエリのキー値 #
my $page = 0; # クエリのページ指定値 #
# #
unless( defined $ENV{'QUERY_STRING'} ) # クエリがないかどうか #
{ # クエリがない場合 #
$page = 0; # 最新ページを表示 #
} # #
else # クエリがある場合 #
{ # #
($qkey, $page) = split( /=/, $ENV{'QUERY_STRING'} ); # クエリを取得 #
} # #
#/Query *******************************************************## #
# HTML Log ****************************************************## HTML出力 ログ部 #
my $cnt = @reada; # 書込み件数取得 #
my $n = 0; # ページ毎出力件数カウント用 #
my $no = ($cnt - 10 * $page); # ログ件端数 最終ページに対応 #
# #
my $name = ""; # 名前 #
my $subject = ""; # タイトル #
my $filename = ""; # ファイル名 #
my $url = ""; # URL #
my $mssid = 0; # ID #
my $time = ""; # 書込み時刻 #
my $size = 0; # ファイルサイズ #
my $ipaddr = ""; # IPアドレス #
my $host = ""; # ホスト名 #
# #
while( $no > 0 && $n < 10 ) # ログ出力は1ページ10件まで, ログがなくなれば終了 #
{ # #
($name, $subject, $filename, $size, $url, $mssid, $time, # ログの内容を各変数に格納 #
$ipaddr, $host, $nouse) = split( /#@#/, $reada[$no - 1] ); # #
$n++; # 出力件数カウントアップ #
# #
print <<HL; # HTML出力 複数行 #
<tr>
<td>
<table width="720" height="20" border="0" align="left" cellpadding="6"
bordercolor="#B8A470" bgcolor="#000000" id="submittion">
</td>
</tr>
<tr>
<td height="0" bgcolor="#000000">
<strong>
<font color="#CC0000">
No.$no $name ($mssid) "$subject" $url $time <!-- 各変数の値を出力 -->
</font>
</strong>
</td>
</tr>
<tr>
<td>
<a href = "http://bj006.com/cgi/dfh/attach/$filename">$filename</a> <!-- ファイルへのリンク -->
<font color="#E0E0E0"> : size = $size byte</font> <!-- ファイルサイズの表示 -->
</td>
</tr>
</table> <!-- HTMLログ部出力終了 ログ部テーブルタグ後 -->
HL
$no--; # ログ件端数カウントダウン #
} # #
# Log Process *************************************************## 過去ログページへのリンク出力 #
print <<LOG; # HTML出力 複数行 #
<tr>
<td>
<a href="http://bj006.com/cgi/dfh/dfh.cgi">
<font size="3">
<strong>
<span style="background-color: #000000">[NEWEST]</span>
</a> Log →
LOG
# #
$page = 1; # 全ログ表示に必要なページ数 == ページ番号 #
while( ($cnt - $page * 10) > 0 ) # より古いログが存在する #
{ # #
print '<a href="http://bj006.com/cgi/dfh/dfh.cgi?page='. # HTML出力 過去ログへのリンク部 #
"$page". # ページ番号をクエリに #
'"><span style="background-color: #000000">['. # #
"$page". # ぺージ番号を表示に #
']</span></a> '; # HTML出力終了 過去ログへのリンク部 #
$page++; # ページ番号カウントアップ #
} # #
print '</strong></font></td></tr>'."\n"; # HTML出力 #
#/Log Process *************************************************## #
print <<END; # HTML出力 複数行 #
<tr>
<td>
<font size="-1">
<strong>Copyright © 2005-2008 baje, All rights reserved.</strong> <!-- コピーライト出力 -->
</font>
</td>
</tr>
</body> <!-- HTML出力の終了 -->
</html> <!-- HTML出力の終了 -->
END
#/HTML Log ****************************************************## #
exit;
** 関連ページ [#r16bbb9c]
[[Perl・CGI入門/パッケージを使う/ID Roll]]~
[[Perl・CGI入門/ファイルアップローダ/ログファイル作成]]
** 修正履歴 [#tedff12b]
-dfh_r2.cgi~
--クッキー読込み部微修正~
#attach( [nolist] ,[noform])
*** 参考ページ [#raf7b681]
http://www.perl-labo.org/~
http://perl.misty.ne.jp/~
[[Perlメモ/CGIモジュール:http://digit.que.ne.jp/work/index.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB#i1]]~