Schrift
[thread]3453[/thread]

Bild aus Datenbank an Browser: wie?



<< >> 6 Einträge, 1 Seite
pktm
 2004-05-13 23:09
#32134 #32134
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich habe jetzt raus, wie man Binärdaten in die MySQL Datenbank reinbekommt ( mittels LOAD_FILE() ).
Jetzt würde ich aber gerne die Daten auch wieder raus kriegen.
Wie denn?
Bis jetzt dieht das bei mir so aus:
Code: (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
#!/Perl/bin/perl -w
use DBI;
use DBD::mysql;
use CGI;

my $dbh = DBI->connect(
'DBI:mysql:logarit:localhost',
'',
'',
{ PrintError => 1, RaiseError => 1, "AutoCommit" => 1, },
) or print STDERR (
"Error in connecting to DBI:mysql:logarit:localhost\n",
die => 1); # immer Returncodes und Fehler auswerten!!!

my $cmd = qq~
SELECT BINARY grafik FROM grafik WHERE name='noname'
~;
my $sth = $dbh->prepare($cmd) or die $!;
$sth->execute() or die $!;
binmode STDOUT;
print "Content-type: image/gif\n\n";
my $grafik = $sth->fetchrow_array();
print $sth->fetchrow_array();
$sth->finish();
$dbh->disconnect();
exit(0);


mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
format_c
 2004-05-13 23:29
#32135 #32135
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich würde das binmod hinter die Headerausgabe tun.
Außerdem würde ich das Statement auf einen Treffer begrenzen wenn nur ein Treffer ausgegeben werden soll.
Kenne aber nicht deine genauen intensionen.
die Headerausgabe würde ich mit CGI machen lassen. Das ist den Geiz nicht wert wenn du schon DBI benutzt.

Gruß Alex\n\n

<!--EDIT|format_c|1084476637-->
Strat
 2004-05-13 23:49
#32136 #32136
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das mit binmode hinter der headerausgabe klingt gut. als naechstes schreibe vielleicht mal das bild in eine datei (binmode(FH) nicht vergessen) und schaue nach, ob sie korrekt ankommt. wenn ja, dann sollte es so funktionieren

Nebenbei: wenn du eine Perl-Version >= 5.6 benuetzt, besser nicht mehr -w verwenden, sondern besser
Code: (dl )
1
2
3
#! /usr/bin/perl
use warnings;
use strict;

weil -w global auf das ganze Script losgelassen wird, also auch auf eingebundene Module, und viele Module sind leider einfach nicht fuer die Zusammenarbeit mit -w geschrieben... und wenn da eine Warnung vor dem Header kommt, bekommst du bei den meisten Webservern einen 500er error...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2004-05-14 13:52
#32137 #32137
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,13.May.2004, 21:49]und wenn da eine Warnung vor dem Header kommt, bekommst du bei den meisten Webservern einen 500er error...[/quote]
Schlecht konfigueriert, wuerde ich da sagen... STDERR gehoert ins error_log!

Aber sowas hat mich auch schon mal gebissen, deshalb gibt es bei mir manchmal den folgenden Code am Anfang eines CGIs:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
BEGIN {
# Netscape, Roxen and Apache 2.0.something do not like warnings...
if (defined $ENV{SERVER_SOFTWARE} &&
$ENV{SERVER_SOFTWARE} =~ m{(netscape|roxen|apache/2\.0)}i
) {
open(STDERR, ">>/tmp/we_redisys_stderr.log");
print STDERR "--- Begin at @{[ scalar localtime ]} ---\n";
} else {
$^W = 1;
}
}
pktm
 2004-05-14 16:37
#32138 #32138
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Und wie lese ich jetzt die Binärdateien aus?
http://www.intergastro-service.de (mein erstes CMS :) )
steffenw
 2004-05-14 17:20
#32139 #32139
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
So nebenbei, was mir auffällt ist, daß Du doppelte Fehlerbehandlung machst, besser gesagt, Deine eigene wird nie greifen, weil "RaiseError => 1" schon dazu führt, daß alle Deine Datenbankaufrufe mit dem Objekt $dbh implizit schon "die" aufrufen. Du mußt damit Fehlermeldungen nicht mehr selbst behandeln, wenn Dir "die" reicht. Wenn Du sie jedoch selbst behandeln willst, setze entweder RaiseError auf 0 oder mache ein "eval{....};" um die kritischen Stellen und fange Fehler in $@ ab.

use DBD::mysql ist überflüssig.

Das Thema finde ich übrigens auch ganz interessant und werde es beobachten.
$SIG{USER} = sub {love 'Perl' or die};
<< >> 6 Einträge, 1 Seite



View all threads created 2004-05-13 23:09.