Andreas Bardeck: Bilder aus Datenbank im Browser anzeigen

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:

  1. Ist es möglich hiermit in der Datenbank als BLOB gespeicherte Bilder im Browser anzuzeigen, und wenn ja wie?

  2. 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.

  1. Hi,

    1. 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.

    1. 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

    1. 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,

      1. 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.

      1. 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

      1. 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

        1. 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

      2. 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

  2. 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

    1. 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

      1. Yo, Danke für die Bestätigung und Ergänzung. :)

        Cruz