Thread Bilder in eine MySQL DB ablegen (5 answers)
Opened by Kean at 2011-11-03 13:20

pktm
 2011-11-03 22:10
#153846 #153846
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Heute ist dein Glückstag :)

Bild in Datenbank einfügen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!perl

use strict;
use warnings;
use Tk;
use Tk::PNG;
use Tk::JPEG;
use DBI;

my $datenbank = "test";
my $db_host = "localhost";
my $db_port = "3306";

my $db_user = "test";
my $db_pw = "test";

my $dsn  = "DBI:mysql:database=$datenbank;host=$db_host;port=$db_port";
my $dbh = DBI->connect( $dsn, $db_user, $db_pw, { RaiseError => 1, PrintError => 0, AutoCommit => 1 } ) or die('Err connect: ' . DBI->errstr());

my $mw = Tk::MainWindow->new();

#my $filename = "test.jpg";
my $filename = "apply.png";
my $bild = $mw->Photo( -file => $filename );

# -- Bild in Variable einlesen
open MYFILE, $filename  or die "Cannot open file: $!";
binmode MYFILE;
my $data;
while (<MYFILE>) {
        $data .= $_;
}

close MYFILE;
# -------------------------

my $sql = q~INSERT INTO photos (photo) values (?)~;
my $sth = $dbh->prepare($sql) or die('Error prep: ' . $dbh->errstr());
$sth->bind_param(1, $data);
my $rv = $sth->execute($data) or die('Error exec: ' . $dbh->errstr());

my $label = $mw->Label(-image => $bild, -background => '#ffffff')->pack();                                                      

$mw->MainLoop();


Bild aus Datenbank auslesen und in Tk anzeigen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!perl

# cf. http://www.james.rcpt.to/programs/mysql/blob/

use strict;
use warnings;
use DBI;
use Tk;
use Tk::PNG;
use Tk::JPEG;
use MIME::Base64 qw(encode_base64);

# Which database and which file from the filesystem?
my $dbname = 'test';
my $username = 'test';
my $password = 'test';

# Make a connection to your database
my $dbh = DBI->connect("dbi:mysql:database=$dbname", $username, $password) or die "Cannot open db";

my $sql = "SELECT photo FROM photos LIMIT 1";
my $sth = $dbh->prepare($sql) or die('Error prep: ' . $dbh->errstr());
my $numrows = $sth->execute() or die('Error exec: ' . $dbh->errstr());

my $ref = $sth->fetchrow_hashref;
my $newdata = $$ref{'photo'};

# siehe: http://www.perl-community.de/bat/poard/thread/5210
$newdata = encode_base64($newdata);

my $mw = Tk::MainWindow->new();

my $bild = $mw->Photo( -data => $newdata );

my $label = $mw->Label(-image => $bild, -background => '#ffffff')->pack();                                                      

$mw->MainLoop();


Beim Einlesen ist wohl speziell bei Windows binmode() wichtig. Laut perldoc -f binmode sollte man das aber sowieso jedes Mal verwenden, wenn man Bilder in eine Variable einliest.

Und bei der Verwendung im Tk-Programm muss das Bild base64-kodiert sein. Das ist wohl eine Einschränkung (Feature?) von Tk. Wenn du die Bilder noch wo anders verwenden möchtest, dann speichere sie am besten richtig ab und kodiere sie in der Anwendung.

Achte auf die Größenbeschränkung der BLOB-Felder. Für mein 65,7 KB-großes Bild musste die Spalte schon als MEDIUMBLOB deklarieren.

Grüße,
pktm
Last edited: 2011-11-03 22:11:40 +0100 (CET)
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Bilder in eine MySQL DB ablegen