''[[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) &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;
 

** 関連ページ [#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]]~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS