C05:ダウンロード数をカウントする

自作ソフトを作って公開していたりすると、どのくらいダウンロードされているかが気になると思います。
今回は、ダウンロード数をカウントするようなCGIを紹介します。
一つのCGIに、カウントする役目と、カウント結果を表示する役目の、両方を持たせています。

ファイルを開く

解説
#!/usr/local/bin/perl
プロバイダがPerlを置いている場所を記述します。
ここでは/usr/local/bin/perlにあるとしています。
$file=$ENV{'QUERY_STRING'};
URLの後ろに記述された文字列を$fileに代入しています。
ここではダウンロードするファイル名として扱います。
☆今回のポイント☆
URLの後ろに続く文字列をデータとして扱おう!
if((index($file,"/")!=-1)||(index($file,"\\")!=-1)){
  exit;
}
他のディレクトリのファイルを指定されたらプログラムを終了させます。
if($file ne ""){
ファイル名が空でない場合は、ここから下の処理を行います。
  open(OUT,"<count.dat");
  open(IN,">count.tmp");
  while($data=<OUT>){
    print IN "$data";
  }
  close(OUT);
  close(IN);
count.datというファイルの中身をcount.tmpというファイルに移し変えています。
  open(OUT,"<count.tmp");
  open(IN,">count.dat");
  $x=0;
  while($data=<OUT>){
    $count=<OUT>
    chop($data);
    chop($count);
    if($data eq $file){
      $x=1;
      $count++;
    }
    print IN "$data\n";
    print IN "$count\n";
  }
  if($x==0){
    print IN "$file\n";
    print IN "1\n";
  }
  close(OUT);
  close(IN);
ファイル名で一行、そのファイルのダウンロード数で一行、といった具合にカウント用ファイルは書かれています。
カウント用ファイルに、渡されたファイル名があればカウントし、渡されたファイル名がなければ新たに追加します。
  print "Content-type:application/octet-stream\n";
  print "Content-Disposition:attachment;filename=$file\n\n";
  $size = -s $file;
  $loop = int($size / 1024);
  $last = $size % 1024;
  open(OUT, $file);
  binmode(OUT);
  binmode(STDOUT);
  for($i=1;$i<=$loop;$i++){
    read(OUT, $buf, 1024);
    print $buf;
  }
  read(OUT, $buf, $last);
  print $buf;
  close(OUT);
渡されたファイル名のファイルを出力します。
}else{
  printf("Content-type:text/plain\n\n");
  printf("[ダウンロード数]\n");
  open(OUT,"<count.dat");
  while($data=<OUT>){
    printf("$data");
  }
  close(OUT);
}
URLの後ろの文字列が指すファイル名が空だった場合は、カウントしているダウンロード数を出力します。
exit;
プログラムを終了させます。