« 8月14日の行動 | メイン | どら焼きと言って、ハガキがでてくることへの考察 »

2005年08月14日

[技術] PostgreSQLで画像をあつかう

【技術メモ】

■テーブル定義
CREATE TABLE images(
id serial primary key not null,
basename varchar(100) not null,
username varchar(100) not null,
title text,
data bytea,
modifydate timestamp,
registdate timestamp DEFAULT now()
);

■CatalystのModel定義
テーブルの追加のやり方がわからない。Modelクラスには一切手をつけていないで、全て再作成されても問題と判断して、以下のように実行。
[y-ishiha@tama XG]$ script/xg_create.pl model Pg CDBI dbi:Pg:dbname=xg y-ishiha
exists "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg.pm"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg/Articles.pm"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg/Guidedata.pm"
created "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg/Images.pm"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/M/Pg/Users.pm"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../t/m/pg_articles.t"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../t/m/pg_guidedata.t"
created "/home/y-ishiha/public_html/catalyst/XG/script/../t/m/pg_images.t"
exists "/home/y-ishiha/public_html/catalyst/XG/script/../t/m/pg_users.t"

■CatalystのController定義
[y-ishiha@tama XG]$ script/xg_create.pl controller Image
created "/home/y-ishiha/public_html/catalyst/XG/script/../lib/XG/C/Image.pm"
created "/home/y-ishiha/public_html/catalyst/XG/script/../t/c/image.t"

■Image.pmの実装


sub default : Private {
my ( $self, $c ) = @_;
$c->res->output('Congratulations, XG::C::Image is on Catalyst!');
}



sub upimage : Global {
my ( $self, $c ) = @_;
my $user = $c->session->{user};
$c->stash->{user} = $user;
$c->stash->{template} = $c->config->{templates}->{upimage};
$c->forward('XG::V::TT');
}


sub regimage : Global {
my ( $self, $c ) = @_;
my $user = $c->session->{user};
my $title = $c->req->param('title') || 'non title';
my $image = $c->req->upload('image');
if ($image) {
my $basename = $image->basename;
my $data = $image->slurp;
my @obj = XG::M::Pg::Images->search(basename => $basename, username => $user);
if (@obj) {
$obj[0]->title($title);
$obj[0]->data($data);
$obj[0]->modifydate('now()');
$obj[0]->update();
}else{
XG::M::Pg::Images->create({basename=>$basename,
username=>$user,
title=>$title,
data=>$data});
}
$c->stash->{size} = $image->size;
$c->stash->{slurp_size} = length($data);
$c->stash->{basename} = $basename;
}
$c->stash->{title} = $title;
$c->stash->{user} = $user;
$c->stash->{template} = $c->config->{templates}->{regimage};
$c->forward('XG::V::TT');
}

sub image : Global{
my ( $self, $c ) = @_;
my $user = $c->session->{user};
my $username = $c->req->param('username');
my $basename = $c->req->param('basename');
my @obj = XG::M::Pg::Images->search(basename => $basename, username => $username);
if (@obj) {
$c->res->headers->content_type('image/jpeg');
$c->res->headers->content_length( length($obj[0]->data) );
$c->res->headers->last_modified(localtime);
$c->res->output($obj[0]->data);
}else{
$c->res->output("not found: $basename of $username");
}
}

■問題点
上記のような実装をして、Image::regimageでデータベースに登録しても、画像データがちゃんと登録されない。ネットで検索したら、Class::DBIの仕様で、以下の記述を入れないとバイナリデータが正しく扱われないそうだ。

__PACKAGE__->data_type(column_name => { pg_type => DBD::Pg::PG_BYTEA } );

そこで、lib::XG::M::Pg::Images.pmに上記の一行を追加したら、正しく登録された。

※今回、画像用のテーブル追加のために、Modelを全部作り直してしまった。次回、同じようなことをするとせっかく入れた上記の一行がなくなってしまう。やはり、テーブル追加時のやり方を見つけておかければ・・・

投稿者 nekobara : 2005年08月14日 15:27


トラックバック

このエントリーのトラックバックURL:
http://www.ishihara.ne.jp/mt/mt-tb.cgi/493

コメント