適当。表示がずれるので空白2文字の全角空白にしていることに注意。
#!/usr/bin/perl -T
use strict;
use warnings;
use utf8;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Pretty;
use Encode;
use constant DOWNLOAD_DIR => '/tmp';
use constant BUFFER_SIZE => '100_000';
# file /tmp/aaa.txt requires password AAA
# file /tmp/bbb.txt requires password BBB
my %pass_of = ( 'aaa.txt' => 'AAA', 'bbb.txt' => 'BBB' );
my $q = CGI->new();
my $file = decode( "utf8", $q->param('file') );
my $pass = decode( "utf8", $q->param('pass') );
if ( defined $file ) {
if ( !exists $pass_of{$file} ) {
print_download_page( $q, 'No such file' );
}
elsif ( $pass_of{$file} eq $pass ) {
download_file( $q, $file );
}
else {
print_download_page( $q, 'Password mismatch' );
}
}
else {
print_download_page($q);
}
sub download_file {
my $q = shift;
my $file = shift || '';
my $file_with_full_path = DOWNLOAD_DIR . '/' . $file;
if ( -r $file_with_full_path ) {
print $q->header(
-type => 'application/octet-stream',
-attachment => encode( "utf8", $file )
);
open( my $fh, '<', encode( "utf8", $file_with_full_path ) )
or croak "$file: $!";
binmode $fh;
my $buffer = '';
while ( read $fh, $buffer, BUFFER_SIZE ) {
print $buffer;
}
close $fh or croak "$file: $!";
}
else {
print_download_page( $q, "$file not found or readable" );
}
}
sub print_download_page {
my $q = shift;
my $message = shift;
my $html = << "END_HTML";
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title> download test </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form method="POST" action="" enctype="multipart/form-data">
<input type="radio" name="file" value="aaa.txt" />Download aaa.txt
<br />
<input type="radio" name="file" value="bbb.txt" />Download bbb.txt
<br />
Password :
<input type="password" name="pass" size="50" maxlength="80" /><br />
<input type="submit" name="Download" value="Download" />
</form>
<hr />
<p>$message</p>
</body>
</html>
END_HTML
print $q->header( -charset => 'UTF-8' ), $html;
}
お礼
さっそくのご回答ありがとうございます。 スクリプトを確認しました。 このコードはダウンロードする際にパスワードを入力させてダウンロードを可能にするという ものですよね? 言葉足らずだったかもしれません。 ダウンロードする際のパスワードではなく、ダウンロード後PDFを開く際にに求められる パスワードです。