C04:パスワード付きダウンロード
自分のホームページに置いてあるファイルを、特定の条件を満たす人にだけダウンロード可能にしたい場合があるかも知れません。
今回は、入力したパスワードが正しかった場合だけファイルをダウンロードさせるようなCGIを紹介します。
例えば自作ゲームを作って、クリアした人にだけオマケのファイルをダウンロードさせたい、といったような時に使えると思います。
ファイルを開く
解説
#!/usr/local/bin/perl
プロバイダがPerlを置いている場所を記述します。
ここでは/usr/local/bin/perlにあるとしています。
#ダウンロードするファイル名
$file="";
ダウンロードするファイルの名前を$fileに代入しています。
#パスワード(半角英数字のみ対応)
$password="";
パスワードに使用する文字を$passwordに代入しています。
$data=$ENV{'QUERY_STRING'};
$data=~ s/password=//;
このCGIを呼び出したページから渡されたデータを$dataに代入しています。
この場合は入力されたパスワードという事になります。
if($password eq $data){
パスワードが一致した場合の処理を、ここから下に書いています。
print "Content-type:application/octet-stream\n";
print "Content-Disposition:attachment;filename=$file\n\n";
CGIとして出力するデータがダウンロードしてファイルに保存させる形式である事を出力しています。
☆今回のポイント☆
出力データをダウンロードさせよう!
$size = -s $file;
$loop = int($size / 1024);
$last = $size % 1024;
open(IN, $file);
binmode(IN);
binmode(STDOUT);
for($i=1;$i<=$loop;$i++){
read(IN, $buf, 1024);
print $buf;
}
read(IN, $buf, $last);
print $buf;
close(IN);
ダウンロードさせるデータ本体を出力しています。
ファイルサイズが大きい可能性があるので、1024Byteずつ読み込んで出力しています。
}else{
printf("Content-type:text/html\n\n");
printf("<html>\n<head>\n<title>エラー</title>\n</head>\n<body>\n");
printf("<font color=\"red\">パスワードが違います。</font>\n");
printf("</body>\n</html>\n");
}
パスワードが一致しなかった場合は、エラー画面を表示しています。
exit;
プログラムを終了させます。