#! /usr/bin/perl # # almob.cgi # 携帯用写真表示CGI # # 1.004 : 2/6/08 : 画像を縮小しないオプションを追加 # 1.003 : 1/30/08 : リンクにaccesskeyを追加 # 1.002 : 12/22/07 : リストファイル無しの場合の表示順オプションを追加 # 1.001 : 11/19/07 : 縮小画像ファイルサイズ制限機能を追加 # 1.0 : 11/11/07 : Created # # http://www.hidekik.com/ # # $Id: almob.cgi,v 1.9 2008/02/06 04:38:27 Hideki Kanayama Exp $ # Copyright(c) 2007-2008 Hideki Kanayama All rights reserved use strict; use CGI qw(:cgi-lib); use CGI::Carp qw(fatalsToBrowser); use GD; use File::Basename; use File::Copy; my $setupfile = "almob_setup.pl"; my $adminpwd="adminpwd.txt"; # このスクリプト名 my $script = basename($0); my $version='1.004'; my $lastupdatedyear='2008'; my $charset = 'Shift_JIS'; my $lang = 0; #### 環境設定 ここから ############## # 元画像があるディレクトリ(almob.cgiからみた相対パス) our $imagedir = "."; # 縮小画像を格納するディレクトリ(almob.cgiからみた相対パス) our $thumbsdir = "thumb"; # 縮小画像を作成 1:する 0:しない our $shrink_en = 1; # アルバムのリストファイル。写真のファイル名、タイトル、コメントをこの中に書く # 1:有効 0:無効 our $listfile_en = 1; our $listfile = "album.lst"; # リストファイルが無い場合の画像表示順 1:最新順 0:アルファベット順 our $nolist_order = 0; # 戻り先のリンク。 (almob.cgiから見た相対パスとファイル名、絶対パス、httpからの指定でも可) our $back_en = 1; our $back = "../.."; our $back_name = '戻る'; # アルバムタイトルの設定 our $title_en = 1; our $title_color = "#000000"; our $title_size = '+2'; our $title_face = ''; # 縮小画像サイズ our $target_width = 240; our $target_height = 240; # 縮小画像のフォーマット 0:jpg, 1:gif, 2:png our $format = 1; # ファイルサイズリミット 1:有効 0:無効 our $size_limit_en = 1; our $size_limit = 25; # コメントの位置 0:写真の上 1:写真の下 our $comment_loc = 0; # 管理人リンク 0:off 1:on our $adminlink_en = 1; #### 環境設定 ここまで ############## require "$setupfile" if (-e "$setupfile"); my $q = new CGI; my $cgierror = $q->cgi_error; &error($cgierror) if ($cgierror); my %in = $q->Vars; %in=&postprocess(%in); if (! -e "$adminpwd"){ if ($in{mode} eq 'wradminpwd'){ &wradminpwd; } else { &setadminpwd; } } my @ext = qw(jpg gif png); if ($in{mode} eq 'setup'){ &setupform; } elsif ($in{mode} eq 'makesetup'){ &makesetup; } else { &dispphoto; } exit; sub dispphoto { my @filelist; my @newlist; my $image; my $previmage; my $nextimage; my $title; my $line; my $comment; my $nexttitle; my $prevtitle; my $prevcomment; my $photoimage; my $phototitle; my $photocomment; my $nextcomment; my $prevlink; my $nextlink; if (!open(FILE,"< $listfile") or $listfile_en == 0){ opendir(IMGDIR,"$imagedir") or &error("ディレクトリ$imagedirが開けません。"); @filelist = grep !/^\./, readdir IMGDIR; closedir(IMGDIR); @newlist = ( grep /\.jpe?g$/i, @filelist); @newlist = (@newlist, grep /\.gif$/i, @filelist); @newlist = (@newlist, grep /\.png$/i, @filelist); if ($nolist_order){ @filelist = sort {(stat("$imagedir/$b"))[9] <=> (stat("$imagedir/$a"))[9]} @newlist; } else { @filelist = sort @newlist; } &error("画像ファイルが${imagedir}にありません。
画像ファイルを${imagedir}に置くか、リストファイルを作成し、設定を正しくしてください。") if ($#filelist == -1); if ($in{image} eq ''){ $image = $filelist[0]; $previmage = ''; $nextimage = $filelist[1]; } else { $image = $in{image}; my $hitnum; foreach (@filelist){ last if (/^$in{image}$/); $hitnum++; } $previmage = $filelist[$hitnum-1] unless ($hitnum == 0); $nextimage = $filelist[$hitnum+1] unless ($hitnum >= $#filelist); } $title = $image; } else { flock FILE, 2; @filelist = ; close(FILE); chomp(@filelist); @filelist = grep !/^\s*$/, @filelist; @filelist = grep !/^\s*,/, @filelist; @filelist = grep !/^\s*#/, @filelist; if ($in{image} eq '') { $line = $filelist[0]; ($image,$title,$comment)=split(/,/,$line); $line = $filelist[1]; ($nextimage,$nexttitle,$nextcomment)=split(/,/,$line); } else { my $i=0; foreach (@filelist){ ($image,$title,$comment)=split(/,/); if ($image eq $in{image}){ ($nextimage,$nexttitle,$nextcomment)=split(/,/,$filelist[$i+1]); ($previmage,$prevtitle,$prevcomment)=split(/,/,$filelist[$i-1]) unless ($i == 0); last; } $i++; } } } $title = $image if ($title eq ''); $nexttitle = $nextimage if ($nexttitle eq ''); $prevtitle = $previmage if ($prevtitle eq ''); my ($body,$path,$exx) = fileparse("$image",'\.\w+'); my $imagefile = "$imagedir/$image"; if ((! -e $imagefile) and $listfile_en == 0){ &error("${imagefile}が見つかりません。
管理用からセットアップ、またはリストファイルを修正してください。"); } elsif (! -e "$imagefile"){ &error("${imagefile}が見つかりません。
$imagedirに置くか、リストファイル内のファイル名を修正してください。"); } &htmlhead($title); if ($title_en){ print "
$title

\n"; } print "$back_name " if ($back_en); print "最新" if ($nolist_order and $listfile_en == 0); print "

\n" if ($back_en or $nolist_order); if ($comment_loc == 0) { &comment_disp("$comment"); } if ($shrink_en == 0){ print "
\n"; } else { if (! -e "$thumbsdir"){ mkdir "$thumbsdir" or &error("$thumbsdirを作成できません。"); } my $im; $image =~ /\.jpe?g$/i and $im = GD::Image->newFromJpeg($imagefile); $image =~ /\.gif$/i and $im = GD::Image->newFromGif($imagefile); $image =~ /\.png$/i and $im = GD::Image->newFromPng($imagefile); my ($width, $height) = $im->getBounds(); my $new_width; my $new_height; if ($width > $target_width or $height > $target_height){ my $width_shrink = $target_width / $width; my $height_shrink = $target_height / $height; my $shrink_ratio; if ($width_shrink < $height_shrink){ $shrink_ratio = $width_shrink; } else { $shrink_ratio = $height_shrink; } $new_width = int($width * $shrink_ratio); $new_height = int($height * $shrink_ratio); } else { $new_width = $width; $new_height = $height; } my $thumbsbody = "${body}_${new_width}x${new_height}"; my $thumbimage = "$thumbsdir/$thumbsbody.$ext[$format]"; if (! -e "$thumbimage"){ &genimage($im,$new_width,$new_height,$width,$height,$thumbimage); } my $kbyte = -s "$thumbimage"; # get file size if ($kbyte > $size_limit * 1024 and $size_limit_en){ my $size_ratio = sqrt(($size_limit*1024)/$kbyte); my $new_width2 = int($new_width * $size_ratio); my $new_height2 = int($new_height * $size_ratio); $thumbsbody = "${body}_${new_width2}x${new_height2}"; $thumbimage = "$thumbsdir/$thumbsbody.$ext[$format]"; if (! -e "$thumbimage"){ &genimage($im,$new_width2,$new_height2,$width,$height,$thumbimage); } } undef $im; print "
\n"; } if ($comment_loc == 1) { &comment_disp("$comment
"); } if ($previmage eq '') { $prevlink="$back"; $prevtitle = "トップへ"; } else { $prevlink = "$script?image=$previmage"; } if ($nextimage eq '') { $nextlink="$back"; $nexttitle = "トップへ"; } else { $nextlink = "$script?image=$nextimage"; } print qq{←$prevtitle\n}; print qq{$nexttitle→
\n}; if ($adminlink_en) { print qq{管理用

}; } &htmltail; } sub comment_disp { my $comment = shift; print "$comment
\n"; } sub postprocess { my (%in) = @_; my $key; my $value; while (($key,$value)=each %in){ next if ($key =~ /^upfile/); my $br = "
"; if ($key !~ /^comment/){ $value =~ s//>/g; } if ($value =~ /\r\n/) { $value =~ s/\r\n/$br/g; } if ($value =~ /\n/) { $value =~ s/\n/$br/g; } if ($value =~ /\r/) { $value =~ s/\r/$br/g; } if ($value =~ /,/) { $value =~ s/,/&\#44;/g; } $in{"$key"}=$value; } return(%in); } sub makecrypt { my $plain = shift; my $salt = join "", ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]; my $result = crypt($plain,$salt) or crypt($plain,'$1$'.$salt.'$'); return $result; } sub checkcrypt { my ($pwd,$encpwd)=@_; return(crypt($pwd,$encpwd) eq "$encpwd" or &checkadmin($pwd)); } sub checkadmin { my $pwd = shift; if (open(FILE,"< $adminpwd")){ my $filepwd = ; close(FILE); my $inpwd = crypt($pwd,$filepwd); return ("$inpwd" eq "$filepwd"); } else { &error('パスワードファイルが存在しません'); } } sub setadminpwd { &htmlhead('管理者用パスワードを入力してください'); print "
\n"; if ($in{mode} eq 'setup'){ print "
管理者用パスワードを入力してください。
\n"; print "\n"; print "
\n"; print "\n"; } else { print "
管理者用パスワードを設定してください。
\n"; print "\n"; print "\n"; print "\n"; } print ""; print "
\n"; &htmltail; } sub wradminpwd { my $plain = $q->param('pwd'); my $passwd = &makecrypt($plain); if (open(FILE,"> $adminpwd")){ print FILE "$passwd"; close(FILE); } else { &error('パスワードファイル作成に失敗しました'); } print "Location: $script\n\n"; } sub setupform { my $inpwd = $q->param('pwd'); &setadminpwd if ($inpwd eq ''); &error('管理用パスワードが違います。') unless &checkadmin($inpwd); my @listfile_check; my @nolist_order_check; my @title_check; my @back_check; my @target_check; my @adminlink_check; my @comment_loc_check; my @format_check; my @size_limit_check; my @shrink_check; $listfile_check[$listfile_en] = "checked"; $nolist_order_check[$nolist_order] = "checked"; $title_check[$title_en] = "checked"; $back_check[$back_en] = "checked"; $adminlink_check[$adminlink_en] = "checked"; $comment_loc_check[$comment_loc] = "checked"; $format_check[$format] = "checked"; $size_limit_check[$size_limit_en] = "checked"; $shrink_check[$shrink_en] = "checked"; &htmlhead('管理人セットアップ'); print "
\n"; print "\n"; print "\n"; print <
  • 管理用リンクを非表\示にしている場合は、$script?mode=setupからパスワードを入力してこのページに入ってください。
  • 数字やカラー指定は必ず半角で指定してください。全角やブランクだとCGIが起動しなくなります。万一間違って全角で書いてしまった場合は、$setupfileをエディタで開きその場所を半角に正しく修正してください。それで直ります。

  • 画像ディレクトリ
    CGIディレクトリからみた相対パス。(almob.cgiからみた相対パス)

    縮小画像ディレクトリ
    CGIディレクトリからみた相対パス。(almob.cgiからみた相対パス)

    縮小画像作成
    作成する 作成しない

    リストファイル
    有効 無効
    アルバムのリストファイル。写真のファイル名、タイトル、コメントをこのファイルに書く。

    リストファイルが無効、または存在しない場合の画像表\示順
    最新順 アルファベット順

    アルバムタイトル
    表\示 非表\示
    色:color= サイズ:size= フォント:face=
    「戻る」リンク
    表\示 非表\示
    戻り先のリンク($scriptからみた相対パスとファイル名、絶対パス、httpからの指定でも可)

    リンク名
    表\示写真サイズ
    アスペクト比(縦横費)を維持したまま縮小します。
    高さ

    表\示写真フォーマット
    表\示のために元写真から上記設定サイズに縮小し、設定フォーマットで作成します。
    jpg gif png
    縮小写真ファイルサイズ制限
    縮小写真のファイルサイズを制限します。縮小率を設定ファイルサイズ以下になるように自動修正します。多少誤差が出る場合もあります。
    有効 無効
    KB
    コメントの位置
    写真の上 写真の下
    管理人リンク
    あり なし
    END print ""; print ""; &htmltail; } ########################################################################### # Setup files write ####################################################### ########################################################################### sub makesetup { my $inpwd = $q->param('pwd'); &setadminpwd if ($inpwd eq ''); &error('管理用パスワードが違います。') unless &checkadmin($inpwd); foreach (keys(%in)){ $in{$_} =~ s/
    /\n/g; $in{$_} =~ s/,/,/g; $in{$_} =~ s/<//g; } open(SETUP,"> $setupfile"); print SETUP <
    $msg
    \n"; &htmltail; exit; } sub htmlhead { my $title = shift; print $q->header(-charset=>"$charset"); print "\n"; print "\n"; print "\n"; print "$title\n"; print "\n"; print "\n"; } sub htmltail { undef $q; my $mysite = ('http://www.hidekik.com/','http://www.hidekik.com/en/')[$lang]; print "

    \n"; print "almob.cgi Ver. $version\n"; print "Copyright(C) 2007-$lastupdatedyear, hidekik.com
    \n"; print "\n"; exit; } sub genimage { my ($im,$new_width,$new_height,$width,$height,$thumbimage) = @_; my $target_im = new GD::Image($new_width,$new_height,1); $target_im->copyResized($im,0,0,0,0,$new_width,$new_height, $width,$height); unless (open(IMAGE, "> $thumbimage")){ &error ("縮小画像ファイル作成に失敗しました。"); } binmode(IMAGE); if ($format == 0){ print IMAGE $target_im->jpeg(85); } elsif ($format == 1) { print IMAGE $target_im->gif(); } else { print IMAGE $target_im->png(); } close(IMAGE); undef $target_im; }