FrontPage

自作ファイルアップローダのHTML出力部

実際に作成したソースコードを公開します。
掲示板と同様、機能の観点でファイルを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) &quot;$subject&quot; $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 &copy; 2005-2008 baje, All rights reserved.</strong> <!-- コピーライト出力         -->
            </font>
        </td>
    </tr>
</body>                                                         <!-- HTML出力の終了                              -->
</html>                                                         <!-- HTML出力の終了                              -->
END
#/HTML Log ****************************************************##                                                  #
exit;

関連ページ

Perl・CGI入門/パッケージを使う/ID Roll
Perl・CGI入門/ファイルアップローダ/ログファイル作成

修正履歴

  • dfh_r2.cgi
    • クッキー読込み部微修正
[添付ファイル一覧] [全ページの添付ファイル一覧]
アップロード可能最大ファイルサイズは 1,024KB です。

管理者パスワード:

参考ページ

http://www.perl-labo.org/
http://perl.misty.ne.jp/
Perlメモ/CGIモジュール


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:14 (3667d)