画像掲示板v.2

 画像掲示板Lightの画像表示部分をアップグレードしました。サイズの大きな画像をアップした場合に、そのまま表示してしまうのでは余りに芸がないと言うものです(*_*)…自分で言ってどうすんねん!?

<HTML>
<HEAD>
<TITLE>画像掲示板v.2</TITLE>
</HEAD>
<BODY TEXT="black" BGCOLOR="#ffffee" LINK="red" VLINK="red">
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" ENCTYPE="multipart/form-data">
<P><INPUT TYPE="HIDDEN" NAME="action" SIZE="-1" VALUE="regist"></P>
<P ALIGN="CENTER"><FONT SIZE="6" COLOR="#000099">画像掲示板v.2</FONT></P>
<P ALIGN="CENTER"><FONT SIZE="2" COLOR="red">お名前とコメントは必ず書き込んで下さい。エラーになります。(何も反応しないよ!)記事の最大記録数は100件です。</FONT></P>
<BLOCKQUOTE>
<P>
<TABLE BORDER="0" WIDTH="88%">
<TR>
<TD WIDTH="12%" ALIGN="RIGHT">
<P ALIGN="RIGHT">お名前:
</TD>
<TD WIDTH="21%"><INPUT TYPE="TEXT" NAME="name" SIZE="15"> </TD>
<TD WIDTH="10%">
<P ALIGN="RIGHT">E-mail:
</TD>
<TD WIDTH="57%"><INPUT TYPE="TEXT" NAME="email" SIZE="25"></TD>
</TR>
<TR>
<TD WIDTH="12%" ALIGN="RIGHT">
<P ALIGN="RIGHT">HomePage:
</TD>
<TD COLSPAN="3"><INPUT TYPE="TEXT" NAME="hp" SIZE="40"></TD>
</TR>
<TR>
<TD WIDTH="12%" ALIGN="RIGHT">
<P ALIGN="RIGHT">題目:
</TD>
<TD COLSPAN="3"><INPUT TYPE="TEXT" NAME="subject" SIZE="40"> 題目色:<INPUT TYPE="RADIO" NAME="scolor" VALUE="blue" checked><B><FONT COLOR="blue">青</FONT></B> <INPUT
TYPE="RADIO" NAME="scolor" VALUE="red"><B><FONT COLOR="red">赤</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="green"><B><FONT
COLOR="green">緑</FONT></B> <INPUT TYPE="RADIO" NAME="scolor" VALUE="#996600"><B><FONT COLOR="#996600">茶</FONT></B> <INPUT
TYPE="RADIO" NAME="scolor" VALUE="#660099"><B><FONT COLOR="#660099">紫</FONT></B></TD>
</TR>
<TR>
<TD WIDTH="12%" ALIGN="RIGHT">
<P ALIGN="RIGHT">コメント:
</TD>
<TD COLSPAN="3"><TEXTAREA NAME="comment" ROWS="4" COLS="60"></TEXTAREA></TD>
</TR>
<TR>
<TD WIDTH="12%" ALIGN="RIGHT">
<P ALIGN="RIGHT">添付画像:
</TD>
<TD COLSPAN="3"><INPUT TYPE="file" NAME="upfile" SIZE="35"><FONT SIZE="2" COLOR="#CC0000"> *GIF、JPG、PNG画像のみ有効。H画像はもちろん禁止!</FONT></TD>
</TR>
<TR>
<TD WIDTH="12%">
<P ALIGN="RIGHT">削除キー:
</TD>
<TD COLSPAN="3"><INPUT TYPE="PASSWORD" NAME="pass" SIZE="7"><FONT SIZE="2" COLOR="#CC0000"> *半角英数4文字以上推奨。削除キーを設定すると、いつでもご自分の記事を削除できます。</FONT></TD>
</TR>
<TR>
<TD WIDTH="12%">&nbsp;</TD>
<TD COLSPAN="3">
<?php
if ($flags == 'return') {
print "<input type=submit value=[" . $return . "]に返信>\n";
print "<input type=hidden name=ress value=$code>\n";
} else {
print "<INPUT TYPE=SUBMIT VALUE=書き込み/更新> <INPUT TYPE=RESET VALUE=リセット>\n";
}
?></TD>
</TR></TABLE>
</FORM>
従来と同じです。
//===================初期設定=====================
//時間の取得
$now = date("Y/m/d H:i:s");
$data_file = "./g_bbs.log"; //データファイル名
$data_max = 100; //データ最大記録数
$page_view = 10; //1ページの記事表示件数
$homegif = "./home.gif"; //ホームページへのリンク用画像
$passwd = "1234"; //管理者用パスワード
$up_dir = '/img/';
$path = dirname($PATH_TRANSLATED).$up_dir;
$w_max = 100; //画像の横幅の最大値(ピクセル)
$h_max = 100; //画像の縦幅の最大値(ピクセル)
画像の表示サイズの最大値を設定します。
//===============データの削除==================
if ($action == "delete") {
 if(($delcode != "") && ($password != "")){
  $delfile = file($data_file);
  $fp = fopen($data_file, "w");
  for($i=0; $i<sizeof($delfile); $i++){
   list($dcode,$dress,$dname,$demail,$dhp,$dsubject,$dscolor,$dcomment,$dfname,$dpass,$dnow,$dhost,$dagent) = split( ",", $delfile[$i]);
   if (($password == $dpass) || ($password == $passwd)) {
    if ($delcode == $dcode) {
     
$delfile[$i] = "";
     if($dfname){
      unlink(".".$up_dir.$dfname);
     }

    }
   }
   fputs($fp,$delfile[$i]);
  }
  fclose($fp);
 }
}
データの削除方法を変更しました。

パスワードと記事コードが一致した場合に、その記事の内容を白紙にして書き込むことによって削除するようにしました。又、同時に登録されている画像があれば削除するよう修正しました。

★int unlink ( string filename )関数…この関数は引数filename で指定されたファイルを削除します。
//===============インライン関数===================
function inline_link($link){
 $link = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$link);
 return $link;
}
従来と同じ。
//===============データの書き込み=================
if ($action == "regist") {
 if ($name && $comment) {
  
$code = time( ); //アクセス時の秒数
  //ホスト名を取得
  $host = getenv("REMOTE_HOST");
  $addr = getenv("REMOTE_ADDR");
  if($host == "" || $host ==$addr){
   $host = gethostbyaddr($addr);
  }
  //訪問者のブラウザ名を取得
  $agent = getenv("HTTP_USER_AGENT");
  //ここから書き込みデータの調整
  $name = htmlspecialchars($name); //特殊文字のHTMLエントリへの変換
  $name = str_replace("\r", "", $name); //文字列の置換
  $name = str_replace("\n", "", $name);
  $email = htmlspecialchars($email);
  $email = str_replace("\r", "", $email);
  $email = str_replace("\n", "", $email);
  $hp = htmlspecialchars($hp);
  $hp = str_replace("\r", "", $hp);
  $hp = str_replace("\n", "", $hp);
  $subject = htmlspecialchars($subject);
  $subject = str_replace("\r", "", $subject);
  $subject = str_replace("\n", "", $subject);
  $comment = htmlspecialchars($comment);
  $comment = nl2br($comment); //HTML改行文字の挿入
  $comment = str_replace("\r", "", $comment);
  $comment = str_replace("\n", "", $comment);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $ress = str_replace(",", "&#44;",$ress);
  $name = str_replace(",", "&#44;",$name);
  $email = str_replace(",", "&#44;",$email);
  $hp = str_replace(",", "&#44;",$hp);
  $subject = str_replace(",", "&#44;",$subject);
  $comment = str_replace(",", "&#44;",$comment);
  //インラインリンクを実現(URLのみ)
  $comment = inline_link($comment);
  if($upfile){
   $source = $upfile;
   $source_name = $upfile_name;
   $source_name = ereg_replace("^(.:.*\\\\)?(.*)", "\\2", $source_name);
   if(($source != "none")&&($source != "")){
    $dest = $path.$source_name;
    if(copy($source,$dest)){
     $imagesize = getimagesize($dest);
     switch($imagesize[2]){
      case 0:
       unlink($dest);
       break;
      case 1:
       $out = $code.".gif";
       rename($dest,$path.$out);
       break;
      case 2:
       $out = $code.".jpg";
       rename($dest,$path.$out);
       break;
      case 3:

       
$out = $code.".png";
       rename($dest,$path.$out);
       break;
     }
    }
   }
  }
  $fname = $out;
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $fname = str_replace(",", "&#44;",$fname);
  //配列要素を文字列により連結
  $input_msg = implode(",", array($code,$ress,$name,$email,$hp,$subject,$scolor,$comment,$fname,$pass,$now,$host,$agent));
  $message = file($data_file);
  $fp = fopen($data_file, "w");
  rewind($fp);
  fputs($fp, "$input_msg\n");
  //最大記録数の調整
  if($data_max <= sizeof($message))
   $msg_num = $data_max - 1;
  else
   $msg_num = sizeof($message);
  for($i = 0; $i < $msg_num; $i++){
   fputs($fp, $message[$i]);
  }
  fclose($fp);
  unset($message);
 }
}
//親記事だけを抜き出す
$message = file($data_file);
for($i=0; $i<sizeof($message); $i++){
 list($rcode,$rress,$rname,$remail,$rhp,$rsubject,$rscolor,$rcomment,$rfname,$rpass,$rnow,$rhost,$ragent) = split( ",", $message[$i]);
 if($rress == ""){
  $PARENT[] = $message[$i];
 }
}
記事番号をアクセス時の秒数で取得するよう修正しました。
//==================HTML表示======================
//1ページ当たりの表示件数の調整
$msg_count = count($PARENT);
if($pline == "")
 $p_line = 0;
else
 $p_line = $pline;
$end_data = $msg_count - 1;
$page_end = $p_line + ($page_view - 1);
if($page_end >= $end_data)
 $page_end = $end_data;
for($i=$p_line; $i<=$page_end; $i++){
 list($code2,$ress2,$name2,$email2,$hp2,$subject2,$scolor2,$comment2,$fname2,$pass2,$now2,$host2,$agent2) = split(",", $PARENT[$i]);
従来と同じ。
 //親記事の表示
 print "<form method=POST action=$PHP_SELF>\n";
 print "<input type=radio name=delcode value=$code2>\n";
 print "<font size=4 color=$scolor2><b>$subject2</b></font>\n";
 if($email2 != "")
  print " <a href=mailto:$email2><b>$name2</b></a>\n";
 else
  print " <b>$name2</b>\n";
 if($hp2 != ""){
  print " <a href=$hp2 target=_top><img src=$homegif border=0></a>\n";
 }
 print " <font size=2 color='green'>$now2</font>\n";
 print "<input type=hidden name=action value=delete>\n";
 print "<font size=2>パスワード:</font><input type=password size=7 name=password>\n";
 print "<input type=submit value=削除></form>\n";
 if($fname2 && file_exists("$path$fname2")){

  $size = getimagesize("$path$fname2");
  $img_w=$size[0];
  $img_h=$size[1];
  if($img_w > $w_max || $img_h > $h_max){
   $w_ritu = $w_max / $img_w;
   $h_ritu = $h_max / $img_h;
   ($w_ritu < $h_ritu) ? $key = $w_ritu : $key = $h_ritu;
   $width = (int) $img_w * $key;
   $height = (int) $img_h * $key;
   echo "<A HREF=.$up_dir$fname2 TARGET=_blank><img src=.$up_dir$fname2 WIDTH=" . $width . " HEIGHT=" . $height . "></A><br><br>";
  }else{
   echo "<img src=.$up_dir$fname2><br><br>";
  }
 
}
 print "$comment2<br><br>\n";
 print "<form method=POST action=$PHP_SELF>\n";
 print "<input type=submit value=返信>\n";
 print "<input type=hidden name=code value=" . $code2 . ">\n";
 print "<input type=hidden name=return value=" . $subject2 . ">\n";
 print "<input type=hidden name=flags value=return>\n";
 print "<font size=2>[$host2] $agent2</font>\n";
 print "</form></blockquote>\n";
★array getimagesize ( string filename , array [ imageinfo ] )関数…この関数は、任意のGIF、 JPG、PNG、SWF ファイルの大きさを定義し、 ファイルの型と HTMLIMG タグ中で通常使用される高さと幅からなる寸法を表す文字列を返します。
返り値は、4つの要素からなる配列です。0番目の要素は、ピクセル単位 での画像の幅。1番目の要素は高さ。2番目の要素は画像の種類を 示すフラグです。1 = GIF、2 = JPG、3 = PNG、4 = SWFです。 3番目の要素はIMGタグで直接利用できる文字列 "height=xxx width=xxx" です。

ここでは、0番目と1番目の返り値を使って、画像の縦横のサイズと、設定してあるそれぞれの最大値との比率を求めています。後はその比率を使って、実際の画像表示のサイズの調整を行います。
//返信記事の表示
 for($j=0; $j<sizeof($message); $j++){
  list($code3,$ress3,$name3,$email3,$hp3,$subject3,$scolor3,$comment3,$fname3,$pass3,$now3,$host3,$agent3) = split(",", $message[$j]);
  if ($code2 == $ress3) {
   print "<blockquote>\n";
   print "<form method=POST action=$PHP_SELF>\n";
   print "<input type=radio name=delcode value=$code3>\n";
   print "RE:<font color=$scolor3><b>$subject3</b></font>\n";
   if ($email3 != "") {
    print " <a href=mailto:$email3><strong>$name3</strong></a>\n";
   } else { print " <strong>$name3</strong>\n";
   }
   if($hp3 != ""){
    print " <a href=$hp3 target=_top><img src=$homegif border=0></a>\n";
   }
   print " <font size=2 color='green'>$now3</font>\n";
   print "<input type=hidden name=action value=delete>\n";
   print "<font size=2>パスワード:</font><input type=password size=7 name=password>\n";
   print "<input type=submit value=削除><blockquote>\n";
   if($fname3 && file_exists("$path$fname3")){

    $size = getimagesize("$path$fname3");
    $img_w=$size[0];
    $img_h=$size[1];
    if($img_w > $w_max || $img_h > $h_max){
     $w_ritu = $w_max / $img_w;
     $h_ritu = $h_max / $img_h;
     ($w_ritu < $h_ritu) ? $key = $w_ritu : $key = $h_ritu;
     $width = (int) $img_w * $key;
     $height = (int) $img_h * $key;
     echo "<A HREF=.$up_dir$fname3 TARGET=_blank><img src=.$up_dir$fname3 WIDTH=" . $width . " HEIGHT=" . $height . "></A><br><br>";
    }else{
     echo "<img src=.$up_dir$fname3><br><br>";
    }
   
}
   print "$comment3<br><br>\n";
   print "<font size=2>[$host3] $agent3</font></blockquote>\n";
   print "</form></blockquote>\n";
  }
 }
 print "<hr>\n";
}
ここも上の親記事での処理と同じです。画像ファイルを指す変数名が異なりますので、注意しましょう。
unset($message);
$next_line = $page_end + 1;
if($page_end != $end_data){
 print "<form method=Post action=$PHP_SELF>\n";
 print "<input type=hidden name=pline value=$next_line>\n";
 print "<input type=submit value=次のページ>\n";
 print "</form>\n";
}
?>
</BLOCKQUOTE>
</BODY>
</HTML>
従来と同じ。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME