ダウンロード用のモジュール追加
(2005.03.28)
ISDNからADSLへの移行が無事に済みましたので、プロバイダ上のホームページ容量を削減する作業を開始しました。まずは、でっか
いファイルのリンク先を自動的に自宅サーバになるようモジュールを追加しました。丁度良いことに自宅サーバには、まるごとコピ
ーを置いてありますので、そっちへのリンクに変更するとOKです。それから、ADSLといっても最低速度の1.5Mbpsなので皆さんがダ
ウンロードする際は最大0.5Mbps(上り速度)ですから、所要時間の表示があれば親切です。これらの表示を自動的にやってくれるモ
ジュールPpDownload.pmを作成しました。動作はこんな感じです。
元のソース(HTMLを見えるようにしてあります)
<PRE PPMOD="PpDownload">
bigdata.dat
</PRE>
変換後は…(HTMLを見えるようにしてあります。リンク先を自宅サーバに変更、ファイルサイズと所要時間も表示)
<A HREF="http://olfa.dip.jp/backup/software/bigdata.dat">bigdata.dat</A> (12,345,678バイトを自宅サーバから05:08で)<BR>
通常はこんな感じに見えます。
bigdata.dat (12,345,678バイトを自宅サーバから05:08で)
PpDownload.pmは以下の通り。
# $VER: module PpDownload for ppmod. 1.0, 2005/03/28
package PpDownload;
local $template;
local $bytepersecond;
local $urlbase;
sub init
{
my($child) = @_;
main::putmessage('verbose', "module load.");
main::putmessage('verbose', "config = '$child->{pathname}'");
my $root;
for ($root = $child; $root->{parent}; $root = $root->{parent})
{
}
$template = $root->{config}->{PpDownloadTemplate};
main::putmessage('verbose', "template '$template'");
$bytepersecond = $root->{config}->{PpDownloadBytePerSecond};
main::putmessage('verbose', "bytepersecond '$bytepersecond'");
$urlbase = $root->{config}->{PpDownloadUrlBase};
main::putmessage('verbose', "urlbase '$urlbase'");
bless(\&parser_download);
push(@main::parsers, \&parser_download);
}
sub parser_download
{
my($child, @inhtml) = @_;
main::putmessage('verbose', "child '$child->{pathname}'");
my $urlrel = '';
my $root;
for ($root = $child->{parent}; $root->{parent}; $root = $root->{parent})
{
if (!$urlrel)
{
$urlrel = "$root->{filename}";
}
else
{
$urlrel = "$root->{filename}/$urlrel";
}
}
$urlrel = "$urlbase/$urlrel";
my @outhtml = ();
my $linebuff = '';
foreach $linebuff (@inhtml)
{
my $targeturl = "$urlrel/$linebuff";
my $atag = '<A HREF="' . $targeturl . '">' . $linebuff . '</A>';
my $targetpath = "$child->{parent}->{pathname}/$linebuff";
my $filebyte = 0;
if (-f $targetpath)
{
$filebyte = -s $targetpath;
$filesize = $filebyte;
1 while $filesize =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g;
}
else
{
main::putmessage('error', "file not found '$targetpath'");
}
my $loadsecond = $filebyte / $bytepersecond;
if ($loadsecond < 5)
{
$loadsecond = 5;
}
my $loadtime = sprintf("%02d:%02d", int($loadsecond / 60), $loadsecond % 60);
my $final = eval('"' . $template . '"');
main::putmessage('verbose', "targetpath '$targetpath'");
main::putmessage('verbose', "targeturl '$targeturl'");
main::putmessage('verbose', "atag '$atag'");
main::putmessage('verbose', "filesize '$filesize'");
main::putmessage('verbose', "loadtime '$loadtime'");
push(@outhtml, $final);
}
return @outhtml;
}
1;