Bilder aus Datenbank im Browser anzeigen
Andreas Bardeck
- datenbank
Hallo,
Ich habe folgendes Problem:
Mittels des XSQL-Servlets (von Oracle) greife ich auf eine Oracle-Datenbank zu. Dies geschieht indem man eine eine einfache Select-Anweisung innerhalb eines <query>-Tags platziert. Als Ergebnis liefert das Servlet die gewünschten Einträge der Datenbank in XML. Nun meine Fragen:
Ist es möglich hiermit in der Datenbank als BLOB gespeicherte Bilder im Browser anzuzeigen, und wenn ja wie?
Macht man eine Select-Anweisung auf die BLOB-Spalte kommt als Ergebnis eine Buchstaben/Zahlen-Kombination des Bildes zurück. Weiß jemand in welchem Format dieses Ergebnis ist und wie man ggf. dieses so umwandelt, das der Browser es anzeigt?
Vielen Dank,
Andreas.
Hi,
- Ist es möglich hiermit in der Datenbank als BLOB gespeicherte Bilder im Browser anzuzeigen, und wenn ja wie?
klaro. Du hast in der DB die Bilddaten, die genauso in einer Datei stehen könnten. In HTTP ist es erforderlich, daß Du den richtigen Content-Type (z.B. image/png, image/gif, image/jpeg) angibst.
- Macht man eine Select-Anweisung auf die BLOB-Spalte kommt als Ergebnis eine Buchstaben/Zahlen-Kombination des Bildes zurück. Weiß jemand in welchem Format dieses Ergebnis ist
Das nennt sich "Bytes". Alle Dateien bestehen daraus.
;-)
und wie man ggf. dieses so umwandelt, das der Browser es anzeigt?
Für den Browser sind das nicht wirre Zeichen, sondern Grafikdaten. Vorausgesetzt, Du teilst ihm mit, daß es sich um eine Grafik handelt (Content-Type).
Cheatah
Danke Cheatah für die schnelle Antwort,
wie allerdings kann ich den Content-Type innerhalb einer XML bzw. HTML-Seite für diese eine Spalte angeben. Ist es etwa so möglich
<img src="Daten aus Datenbank" conten-type="image/png"/> oder wie bekomme ich das Bild neben anderen Dingen auf den Bildschirm?
Andreas.
Hi,
- Ist es möglich hiermit in der Datenbank als BLOB gespeicherte Bilder im Browser anzuzeigen, und wenn ja wie?
klaro. Du hast in der DB die Bilddaten, die genauso in einer Datei stehen könnten. In HTTP ist es erforderlich, daß Du den richtigen Content-Type (z.B. image/png, image/gif, image/jpeg) angibst.
- Macht man eine Select-Anweisung auf die BLOB-Spalte kommt als Ergebnis eine Buchstaben/Zahlen-Kombination des Bildes zurück. Weiß jemand in welchem Format dieses Ergebnis ist
Das nennt sich "Bytes". Alle Dateien bestehen daraus.
;-)
und wie man ggf. dieses so umwandelt, das der Browser es anzeigt?
Für den Browser sind das nicht wirre Zeichen, sondern Grafikdaten. Vorausgesetzt, Du teilst ihm mit, daß es sich um eine Grafik handelt (Content-Type).
Cheatah
Danke Cheatah für die schnelle Antwort,
wie allerdings kann ich den Content-Type innerhalb einer XML bzw. HTML-Seite für diese eine Spalte angeben. Ist es etwa so möglich
<img src="Daten aus Datenbank" conten-type="image/png"/> oder wie bekomme ich das Bild neben anderen Dingen auf den Bildschirm?
Andreas.
Hi,
guck mal in die PERL Doc bei Mime::Base64, damit kannst du
das Bild aus einem ascii code zurückcodieren.
Wie Hajo schon sagte, den richtigen header senden und
vor dem print an den Browser musst du auch
binmode STDOUT;
machen. Dann kommt auch das Bild; Rolf
Danke Cheatah für die schnelle Antwort,
wie allerdings kann ich den Content-Type innerhalb einer XML bzw. HTML-Seite für diese eine Spalte angeben. Ist es etwa so möglich
<img src="Daten aus Datenbank" conten-type="image/png"/> oder wie bekomme ich das Bild neben anderen Dingen auf den Bildschirm?
Andreas.
Hi again,
ich hatte vorhin ne lange Leitung, wie ich sehe willst du
ja nicht nur das Bild haben. In diesem Fall würde ich das
Bild aus dem Blobfeld auslesen und erst einmal auf der
Festplatte als Bild ablegen (ggf. decodieren und vor dem
Anlegen der Datei den binmode HANDLER nicht vergessen).
Dann die Seite mit dem Bild erzeugen mit
content-type:text/html
und das Bild ganz normal als <img src=....> einfügen.
Daneben/darunter kann ja dann was Anderes stehen.
So gehts dann auch mit mehreren Bildchen....
Sonnige Grüße aus KA; Rolf
Hi,
<img src="Daten aus Datenbank" conten-type="image/png"/>
das, was im src-Attribut steht, ist die Angabe einer Ressource (URL also), hinter der ein Script (oder was auch immer) steckt, das _nur_ die Grafikdaten zurückliefert. Diese werden mit einem HTTP-Header zurückgesandt, welcher den Content-Type beinhaltet.
Siehe auch RoRos Antwort.
Cheatah
Hallo Leute,
An dieser Stelle mal eine Frage:
Gibt es irgendeinen Vorteil, wenn man Files (wie Bilder) in Blobs speichert, anstatt sie ins Filesystem zu speichern und in der Datenbank nur den Dateinamen zu speichern?
Für das letztere hätte ich das Argument, daß die Datenbank einfach kleiner und dadurch schneller bleibt. Über nicht fixed-length Felder kann man ja nicht mal einen Index legen.
Ciao
Cruz
Hi,
Gibt es irgendeinen Vorteil, wenn man Files (wie Bilder) in Blobs speichert, anstatt sie ins Filesystem zu speichern und in der Datenbank nur den Dateinamen zu speichern?
<provokant> nein. </provokant>
Es kann Vorteile haben, wenn man z.B. ein DB-basiertes Content-Management-System verwendet. Aus Erfahrung sage ich aber: Im Filesystem sind die Dinger besser aufgehoben.
Für das letztere hätte ich das Argument, daß die Datenbank einfach kleiner und dadurch schneller bleibt.
Och, das stört eigentlich nicht wirklich. LOBs schreibt man gewöhnlich nicht in eine Tabelle, die für andere Daten ausgelegt ist... :-)
Über nicht fixed-length Felder kann man ja nicht mal einen Index legen.
Das braucht man bei Grafikdaten gewöhnlich auch nicht. Setz den Index über Namen, Content-Type, Größe... oder was immer Du halt brauchst.
Wichtig zu wissen: Der Server kann Dateien direkt ausliefern. DB-Inhalte müssen jedoch den Umweg über eine Programmlogik gehen. Den Zeitaufwand auf DB-Seite unterschlage ich in der Annahme, diese sei hochperformant.
Cheatah
Yo, Danke für die Bestätigung und Ergänzung. :)
Cruz