初心者だけどPerlが大好き

コードが世界を変える!

バイナリーデータをMySQLから出す    

newmime64db.cgi

#!D:/xampp/perl/bin/perl
use CGI;
use MIME::Base64;
use DBI;
use utf8;
$q = new CGI;
$dbname = "trinity777";
$user = "root";
$passwd = "あなたのパスワードにしてね";
$tbname = "trinity999";
$host = "localhost";
$myname=$q ->param('name');
$mode = $q->param( 'mode' );
# リンクURLからidのパラメーターが作られました(フォームからのではありません)
$id = $q->param( 'id' );
# ファイルネームにファイルのポップアップのリンクが貼られたら起動
if($mode eq 'view' && $id){
# DBに接続
$dbh=DBI->connect("DBI:mysql:$dbname; host=$host", $user, $passwd) 
or die $DBI::errstr;
$dbh->do("SET NAMES utf8");
# ファイルタイプとファイルの中味を呼び出すSQL実行
$sth = $dbh->prepare(" SELECT type, uploaded_file  FROM  $tbname WHERE id =$id ");
if(!$sth->execute){print "SQL失敗\n";exit;}
@rec = $sth->fetchrow_array();
# ファイルの内容をポップアップで'utf-8'で呼び出します
# Shft-JISで作られたtxtファイルは文字化けするけど
# ブラウザの文字コードをShft-JISにすればきれいに表示されます
print $q->header(-type =>$rec[0],-charset => 'utf-8'),
$decode=decode_base64($rec[1]);
binmode($decode);
print $decode;
$sth->finish;
$dbh->disconnect;
exit;
}
# 名前で検索をするフォームの提示
print $q->header(-type =>'text/html',-charset => 'utf-8'),
$q->start_html(-title=>"Database Form"),
$q->h1(' 名前で検索してみましょう'),
$q->start_form,
$q->textfield(-name=>'name'),
$q->reset,
# mode と viewがあれば リンクを作るのが楽チンになります
$q->hidden(-name =>'mode', -value =>'view'),
$q->submit(-name =>'Action', -value =>'送信'),
$q->end_form;
if($q ->param('name')){searchform();}
# 名前があればDBに接続
sub searchform{
$dbh=DBI->connect("DBI:mysql:$dbname; host=$host", $user, $passwd) 
or die $DBI::errstr;
$dbh->do("SET NAMES utf8");
# データを検索して提示するSQL実行
$sth = $dbh->prepare(" SELECT * FROM  $tbname WHERE name = '$myname' ");
if(!$sth->execute){print "SQL失敗\n";exit;}
print $q->start_table({-border=>1}),
$q->start_Tr,
$q->th(['id', 'mtime','name','email','subject', 'comments','filename','type']);
while (@rec = $sth->fetchrow_array())
{
print $q->start_Tr,
$q->td([$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[7]]),
$q->td,
# ファイルネームにファイルのポップアップのリンクを貼ります
$q->a({href=>$q->url()."?mode"."="."view&id"."="."$rec[0]",target=>"_blank"}, "$rec[6]"),
$q->end_td;}
# ステートメントハンドルクリア
$sth->finish;
# DB切断
$dbh->disconnect;}
print $q->end_html;

バイナリーデータをMySQLに入れる     

さて。ヘビメタ普及委員会のコミュをMixiで始めまして遊びすぎました
Mixiって Perl と MySQL で動いているんですよ。ご存知でしたか?

久し振りのブログの更新になってしまいました。

フォームは いつものです マルチパートですから添付ファイル対応です
'form.css'も いつも 使いまわしているヤツです

newmime64tomakedb.cgi

#!D:/xampp/perl/bin/perl
use utf8;
use CGI;
$q = new CGI;
print $q->header(-charset => 'utf-8'),
$q->start_html(-title=>"Example CGI.pm Form", -style=>{'src'=>'form.css'}),
$q->h1(' Example CGI.pm Form'),
$q->start_div({-class=>"aaa"}),
$q->p('これは class="aaa" の部分です'),
$q->start_multipart_form(-action=>"newmime64makedb.cgi"),
$q->em("What's your name?"),
$q->br,
$q->br,
$q->textfield(-name=>'name'),
$q->checkbox('Not my real name'),
$q->br,
$q->em("What's your e-mail?"),
$q->br,
$q->br,
$q->textfield(-name=>'email'),
$q->br,
$q->em("What's your subject?"),
$q->br,
$q->br,
$q->textfield(-name=>'subject'),
$q->br,
$q->em('Any parting comments?'),
$q->br,
$q->br,
$q->textarea(-name=>'comments',-rows=>3,-columns=>50),
$q->br,
$q->br,
$q->filefield(-name=>'uploaded_file',
                -default=>'starting value',
                -size=>50,
                -maxlength=>80),
$q->reset,
$q->submit(-name =>'Action', -value =>'送信'),
$q->submit(-name =>'Action', -value =>'Scream'),
$q->end_multipart_form,
$q->end_div,
$q->start_div({-id=>"bbb"}), 
$q->h3('これは id="bbb" の部分です'),
$q->end_div,
$q->start_div({-class=>"ccc"}),
$q->h3('これは class="ccc" の部分です'),
$q->end_div,
$q->end_html;
form.css
/* --基本部分の設定-- */ 
body{background-color:#66ffcc;font-size:20px;line-height:20px}
h1{text-align:center;margin:0 15%;
background-color:#eea8aa;
font-size:20px;
color:#ffffff;
font-style:italic;}
em{font-size:20px;
border-bottom:dashed;
color:#808000;}
#bbb {color:#ff1493;margin:0 15%;line-height:12px;}
.ccc {color:#008000;margin:0 15%;line-height:15px;}
.aaa{border:solid 20px red;margin:2px 15%;padding:0px;line-height:20px;}

それで 重要なのは

$tbname = "trinity999"; となっている部分です
以前作成した trinity888というテーブルを複製して
trinity999 を作成し id 主キーに設定 AI にチェックして オートインクリメント
Field typeのfilename の次に 挿入で 
Field に type を追加 varchar 20 とします
Field uploaded_file は Type に mediumblob としてください
そうしないと バイナリーデータを入れることができません

newmime64makedb.cgi

#!D:/xampp/perl/bin/perl -w
use CGI;
use Jcode;
use MIME::Base64;
use File::Basename;
use DBI;
use utf8;
$dbname = "trinity777";
$user = "root";
$passwd = "あなたのパスワードにしてね";
$tbname = "trinity999";
$host = "localhost";
$q = new CGI;
my $localtime = localtime();
$myname=$q->param('name');
$myemail=$q->param('email');
$mysubject=$q->param('subject');
$mycomments=$q->param('comments');
$myuploaded_file=$q->param('uploaded_file');
$type = $q->uploadInfo($myuploaded_file)->{'Content-Type'}; 
# ファイルシステムの設定(デフォルト:Unix)
fileparse_set_fstype('MSWin32');
my $basename= basename($myuploaded_file,"");
# ファイルハンドル取得
my $fh = $q->upload('uploaded_file');
# バイナリデータとして読み込む
binmode $fh;
my $data ='';
while (read $fh,$buf,60*57){$data.=$buf;}
close $fh;
#バイナリデータをBASE64することでASCIIテキストにする
$base64filebody= encode_base64($data,'');
print $q->header(-type =>'text/html', -charset =>'utf-8');
print $q->start_html;
# DBに接続
$dbh=DBI->connect("DBI:mysql:$dbname;host=$host", $user, $passwd,
                 {RaiseError => 0, PrintError => 1});
if(!$dbh){print "接続失敗\n";  exit;}
$dbh->do("SET NAMES utf8"); 
# INSERT文作成
$sql="insert into $tbname(mtime,name,email,subject,comments,filename,type,uploaded_file)
values('$localtime','$myname','$myemail','$mysubject','$mycomments','$basename',
'$type','$base64filebody')";
# SQL実行
$sth = $dbh->prepare($sql);
if(!$sth->execute){
    print "SQL失敗\n";
    exit;
}
# ステートメントハンドルクリア
$sth->finish;
# DB切断
$dbh->disconnect;
print "登録完了\n";
print $q->end_html;