#! c:/perl/bin/perl # # flist2.cgi # # 2.004 : 6/11/06 : ボタン名を修正 # 2.003 : 2/18/06 : 戻るリンクを追加 # 2.002 : 10/27/05 : ファイル表示をソートするように変更 # 2.001 : 10/2/05 : Copyrightにリンクを追加 # 2.0 : 4/2/05 : filelist.cgiにダウンロードボタンを追加 # # Need Archive::Zip # # $Id: flist2.cgi,v 1.13 2006/06/10 20:34:11 Hideki Kanayama Exp $ # Copyright(c) 2005-2006, Hideki Kanayama, All rights reserved. use Archive::Zip; use CGI::Carp fatalsToBrowser; use Cwd; $script="flist2.cgi"; $version = "2.004"; $updatedyear = "2006"; $lang = 0; #公開するファイルがあるディレクトリ $dldir = "files"; #テンポラリファイル名、ディレクトリ $prefix = 'flist'; $zipfile = "$prefix$$.zip"; $zipdir = cwd(); #$zipdirにあるテンポラリ.zipファイルを削除するまでの時間(分) $expire = 60; #タイトル $title = 'filelist'; #戻るリンク $back = "../flist2.html"; $backname = "解説ページへ"; &error("ディレクトリ$dldirが存在しません") if (! -d $dldir); &error("ディレクトリ$zipdirが存在しません") if (! -d $zipdir); opendir(DLDIR, "$dldir") or &error("ディレクトリ$dldirが開けません"); @filelist = sort grep !/^\./, readdir DLDIR; closedir(DLDIR); %in = &parsedata; if ($in{mode} eq 'download'){ &makezip; } else { &display; } exit; sub makezip { my $zip = Archive::Zip->new(); my $member; chdir($dldir); my $i=0; my $eachfile; foreach (keys(%in)){ if ($in{$_} eq 'on'){ next if ($_ eq allon || $_ eq alloff); /check_(\d\d*)/; $eachfile = $filelist[$1]; $member = $zip->addFile("$eachfile"); } } my $status = $zip->writeToFileNamed("$zipfile"); if ($status != AZ_OK) { unlink("$zipfile") if (-e "$zipfile"); &error("$zipfileが作成されません") } rename "$zipfile", "$zipdir/$zipfile"; chdir($zipdir); print "Location: $zipfile\n\n"; } sub display { opendir(ZIPDIR, "$zipdir") or &error("ディレクトリ$zipdirが開けません"); @ziplist = grep /^$prefix.*\.zip$/, readdir ZIPDIR; closedir(ZIPDIR); my $zipfile; my $now = time; foreach $zipfile (@ziplist){ ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$zipdir/$zipfile"); if ($now > $d_mtime + $expire * 60){ unlink("$zipdir/$zipfile"); } } print "Content-Type: text/html\n\n"; &beginning; print qq|
\n|; print qq|\n|; print qq|

\n|; print qq|全部オン\n|; print qq|全部オフ
\n|; my $i; for ($i=0;$i<=$#filelist;$i++){ $dlfile = $filelist[$i]; chomp($dlfile); $dllistfile = "$dldir/$dlfile"; ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$dllistfile"); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($d_mtime); $update = sprintf("%s年%s月%s日%02s時%02s分",$year+1900,$mon+1,$mday,$hour,$min); if ($d_size > 1048576){ $size = sprintf("%.1fMB",$d_size/1048576); } elsif ($d_size > 1024){ $size = sprintf("%.1fkB",$d_size/1024); } else { $size = sprintf("%dB",$d_size); } $checkname = "check_$i"; print qq||; print "$dlfile ($size)"; print " .......... $update
\n"; } print qq|

\n|; print "

\n"; &ending; } sub beginning { print ""; print < $title HEADPRINT &jsset; print "\n"; print "\n"; print "$backname
\n"; print "
\n"; } sub ending { my $mysite = ('http://www.hidekik.com/','http://www.hidekik.com/en/')[$lang]; print "
\n"; print qq|
flist2.cgi Ver. $version
Copyright(c) 2005-$updatedyear, hidekik.com
\n|; print ""; print ""; } sub error { print "Content-Type: text/html\n\n"; &beginning; print "
$_[0]
\n"; &ending; exit; } sub jsset { my (@locallist) = @filelist; print < function allcheck(){ if (document.selectfile.allon.checked==1){ document.selectfile.alloff.checked=0; JSDISP1 my $localfile; my $i=0; foreach $localfile (@locallist){ $check = "check_$i"; print " document.selectfile.$check.checked=1;\n"; $i++; } print " }\n"; print "}\n"; print < JSDISP3 } sub parsedata { if ($ENV{"REQUEST_METHOD"} eq "GET"){ $data=$ENV{"QUERY_STRING"}; $method = 'GET'; } elsif ($ENV{"REQUEST_METHOD"} eq "POST"){ read(STDIN,$data,$ENV{"CONTENT_LENGTH"}); $method = 'POST' } @tmparray=split(/&/,$data); foreach $string (@tmparray){ ($key,$value)=split(/=/,$string); $in{"$key"}=$value; } return(%in); }