#! 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"; &ending; } sub beginning { print ""; print <