Binärdatei aus Datenbank auslesen und in Tabelle anzeigen lassen

  • Hallo Forum,


    ich habe folgendes Problem:


    In meiner Datenbank in einem BLOB-Feld sind die Binärdaten eines Jpeg - Bildes abgespeichert.


    Beim Auslesen aus der Datenbank lass ich mir die Daten mit echo Anzeigen, das Bild erscheint, so weit so gut.


    Lass ich mir mit PHP eine Tabelle zeichnen und füge bei Tabledata die gleichen Angaben ein wie ich sie mit echo ohne Tabelle ausgeben lasse, erscheint nur der Binärcode.


    Wer weiss Rat ?


    Hier der PHP-Code:



    [code=php]


    <?php



    mysql_connect("localhost","root",".....");
    mysql_select_db("versuchsdatenbank");
    $db = mysql_query("SELECT Bilddaten, Beschreibung FROM bilder ");
    $ausgelesen = mysql_fetch_array($db);



    echo "<table border='1'>";


    echo "<tr>";


    echo "<td>";


    echo $ausgelesen['Bilddaten'] ;


    echo "</td>";


    echo "<td>";


    echo $ausgelesen['Beschreibung'] ;


    echo "</td>";


    echo "</tr>";


    echo "</table>";


    [/PHP]


    Für Hilfe, besten Dank im voraus............

  • Ich würde mal drauf tippen das du ein Image-Tag brauchst:


    PHP
    <img src="data:image/jpg;base64,
    <?=$ausgelesen['Bilddaten'] ;?>" alt="" />
  • Haut irgendwie nicht hin ?


    Das merkwürdige ist wenn ich das Array vor der Tabelle mit echo anzeigen lasse, erscheint ordnungsgemäss das Bild, aber die Tabelle nachher wird nicht gezeichnet.


    Umgekehrt, lass ich das Array vor der Tabelle nicht mit echo ausgeben, sondern erst innerhalb Tabledata, wird die Tabelle gezeichnet aber das Bild erscheint als Binärcode innerhalb Tabledata ?(

  • Ganz andere frage.. wieso zur hölle ist da ein JPEG in der Datenbank?
    Das hier sollte funktionieren .. das while ist (sowieso früher oder später) wichtig..


    etwas .. schöner anzuschauen:

  • Das Bild kommt über Input type File in die Datenbank, die Bilder müssen Serverseitig gespeichert sein, wegen dem Zugriff.



    <!DOCTYPE html>
    <html>


    <head>
    <title>Bildupload</title>


    <meta charset="UTF-8">
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="keywords" content="">
    <meta name="generator" content="Webocton - Scriptly (www.scriptly.de)">


    </head>


    <body>




    <?php



    mysql_connect("localhost","root","........");
    mysql_select_db("versuchsdatenbank");




    if (array_key_exists('Bild',$_FILES))


    {
    $bilddaten = $_FILES['Bild']['tmp_name'];
    $datenoffen = fopen($bilddaten,"r");
    $daten = addslashes(fread($datenoffen,filesize($bilddaten)));
    $befehl = "INSERT INTO bilder
    (
    Bilddaten
    )
    VALUE
    (


    '$daten'



    )
    " ;



    if (!mysql_query($befehl))


    die (mysql_error());



    }



    ?>


    <form name="bilder" action="bilder.php" method="post" enctype="multipart/form-data">



    <input type="file" name="Bild" value="" size="20" maxlength="50" />
    <input type="submit" name="send" value="Send" />



    </form>
    </body>
    </html>

  • Wegen welchem zugriff?
    Du kannst sie auch so serverseitig speichern ohne sie in ne Datenbank zu packen..
    Weg:
    Wenn die Datei hoch geladen wird, speicherst du sie in ein gesperrtes Verzeichnis und gibst ihr einen eindeutigen namen.
    Diesen schreibst du dann mit der Beschreibung und den Zugriffsrechten in die Datenbank (nicht die Datei, nur den Namen)
    Wenn du jetzt die Datei ausgeben willst, prüfst du die Zugriffsrechte und lädst dann via PHP das Bild und gibst es aus..


    Bitte lies dir Den eigenen Code lesbar im Forum präsentieren bitte durch!

  • Ich gestehe, ich bin nicht der Forumprofi.......sorry, mein vorrangiges Problem ist das es nur in Binärdaten ausgegeben wird und nicht als Bild.Warum sollte man Bilder nicht direkt in der Datenbank speichern ? Ob sie in einer Datei sind auf dem Server oder in der Datenbank direkt sehe ich im Moment keine Vor oder Nachteile, aber vielleicht kommt das noch............

  • Einer der Nachteile ist, das du es nicht selbsständig schaffst es wieder als Bild herrauszuholen.
    Ein weiterer, das deine Datenbank schnell monströß groß wird.
    Vor '20' Jahren war das cool alle Bilder in der DB zu speichern, macht man aber nichtmehr.
    Noch einer ist, das dein Server unnötig dadurch belastet wird, Bilder aus der Datenbank auszugeben. Ich zähle nicht weiter auf.. aber da gibt es noch das ein oder andere..


    Du musst kein Profi sein, aber der Weg wäre, das verlinkte zu lesen, deinen Beitrag zu bearbeiten, deinen Code in BB-Tags packen, und die unnötigen Leerzeilen zu entfernen. Dann hat man schon mehr Lust sich wirklich um dein Problem zu kümmern, weil man dann deinen Code lesen kann.!


    Dann solltest du dich mit mysqli_*() beschäftigen, da das von dir verwendete mysql_*() schwere Sicherheitslücken aufweist und veraltet ist.
    Weiterhin solltest du dich damit beschäftigen Datenbankabfragen sicher zu gestalten um sog. injections zu vermeiden -> bei deinem Code recht einfach (trotz adslashes())


    Und dann solltest du dir überlegen ob du nicht einfach auf meinen Rat hören willst, zwingt dich keiner dazu, ist nur ein tip ;)

  • Einer der Nachteile ist, das du es nicht selbsständig schaffst es wieder als Bild herrauszuholen.


    Das ist doch kein Nachteil - das ist eine Hürde :D


    Ich denke das ~Format in der db ist anders, als "erwartet".
    Du liest die Bilddatei und schickst die Daten durch addslashes().
    Dabei werden .. naja, slashes ge-added.
    Wenn Du die Rohdaten über der Tabelle ausgibst, dann wird (Vermutung) der Browser evtl damit klar kommen.
    Innerhalb der Tabelle werden die slashes wohl einiges "kaputt machen".


    Sinnvoll wäre es die Rohdaten der Datei (so wie sie sind) in die db zu schreiben.
    Aber - wie bereits erwähnt hat das Nachteile. Der wohl größte ist, dass Browser diese Bilder nicht cachen können.
    Browser cache im Detail: https://de.wikipedia.org/wiki/Browser-Cache



    Wenn Dus noch versuchen möchtest: Daten aus Blob-Feld in mysql-DB auslesen
    dort hatten wir ein ähnliches Problem.


    Wenn ich mich richtig erinnere, dann muss es zB ein jpeg sein, wenn es als <img src="data:image/jpeg ... ausgegeben werden soll.


    Der Ablauf von der Bilddatei bis hin zu Ausgabe wäre in etwa:
    - via <form ...> Bilddatei uploaden (lassen)
    - per PHP die Bilddatei in ein (zB) .png umwandeln (funktioniert das nicht, war es kein Bild)
    - die neuen Bilddaten in die db schreiben
    - bei der Ausgabe immer:

    HTML
    <img src="data:image/png;base64,{bilddaten}" />


    png nutzen. Denn alle Bilddaten in der db sind ja nach der Umwandlung pngs.

  • Hallo Cotton,
    du bist mir schon symphatisch, genau es ist eine Herausforderung, der man sich stellen muss.


    Das Bildformat habe ich berücksichtigt, es ist ein jpeg Bild. Ich sehe nicht ein, warum man Bilder nicht in der Datenbank speichern soll, wozu gibt es dann die BLOB - Felder, also ist davon auszugehen, dass die Datenbank und Server damit klarkommen, wäre ja sonst unsinnig.Bei 3000 Bildern und mehr in einem Dateisystem mit verlinkungen, ich weiss nicht. Ich werde mal deinen Anweisungen folgen und sehen was dabei rauskommt, melde mich dann wieder, danke vorerst mal !

  • Logisch kannst du Bilddateien in deiner Datenbank speichern, die dann aber in ein sichtbares Format umwandeln und ausgeben ist sinnlos ressourcenaufwändig im Gegensatz zum direkten speichern des Bildes als Bild. Blob Felder waren ursprünglich mal dazu gedacht das Übertragen von Daten zwischen 2 Datenbanken(/Systemen) reibungsloser ablaufen zu lassen. Außerdem lassen sich so Datentypen speichern, die noch nicht wirklich vorhanden sind, eher waren, heutzutage ist das natürlich nicht mehr so häufig.

  • Also auf die Gefahr hin ,das ich mich hier zum Affen mache, ist es doch so, und korrigiert mich wenn ich falsch liegen sollte.


    Um ein Bild vom eigenen Computer auf einen Server hochzuladen benötigt man den Input Type file , mit dem man die Bilddatei auf dem eigenen Computer auswählen kann.

    Mit normalen HTML-Formularen kann man nicht nur Textinformationen, sondern auch Binärdaten an einen Webserver verschicken. Dazu muss lediglich in das Tagdas zusätzliche Attribut enctype="multipart/form-data" aufgenommen werden und das Formular ein Eingabefeld vom Typ file bekommen. Das erzeugt dann bei der Darstellung die typische Kombination aus einem Feld für den Namen einer lokalen Datei und dem Button Durchsuchen, um die Datei bequem ansteuern zu können. Schickt man das Formular ab, werden die Daten von PHP in einer temporären Datei auf dem Server gespeichert und die Systemvariable $_FILE enthält alle notwendigen Informationen, um die empfangenen Daten auszuwerten, wie etwa den Namen der temporären Datei oder den MIME-Typ der Datei, den der Browser zur Identifizierung mitschickt.
    Das heisst für mich, es sind eh Binärdaten die die hochgeladen werden, egal mal wo ich denn die Speichere auf dem Server, die dann ebenfalls zur Anzeige wieder umgewandelt werden müssen, also betreffend Rechenleistung dürfte das auf das selbe rauskommen betreffend Serverlast und/oder Rechenleistung. Ob die Binärdaten aus einer Datenbank ausgelesen werden oder aus einem Ordner, denke ich, dürfte kein grosser Unterschied bestehen oder ?
    Mein Problem liegt im Moment darin, die hochgeladenen Binärdaten in die Datenbank, als Bild wieder rauszubekommen, was mit echo in PHP problemlos klappt. Was nicht funktioniert im Moment, die Datei innerhalb einer Tabledatazelle wird nicht als Bild sonder als Binärcode angezeigt. Wieso funktioniert es mit echo und innerhalb einer Tabellenkostruktion nicht ? Eine echte Herausforderung ? ?( ?( ?(

  • Wenn du die Datei auf dem Server speicherst wird sie wieder in eine 'normale' Datei umgewandelt (EINMALIG)
    Wenn du sie aus der DB holst, muss sie bei jedem Seitenladen umgewandelt werden (MEHRFACH)

  • Die hochgeladene Datei wird auf dem Server meines Wissens nach nicht als binary abgelegt sondern als Original, demnach fände gar keine Umwandlung statt.Wäre auch irgendwie nicht mehr zeitgemäß und unnötig Aufwändig.

  • Folgende weitere Erkenntnisse: Lasse ich den File upload ohne addslashes mit print_r ausgeben, wird das Bild angezeigt und auch in der DB gespeichert.Nur beim Auslesen kommt ein Zeichensalat. ?( Wenn ich die Datei von der DB downloade ist es eine Datei mit der Endung .bin

  • Sorry, garnicht mehr daran gedacht: encode die Bilddaten aus der db mit base64_encode()


    HTML
    <img src="data:image/png;base64,<?php echo base64_encode($data); ?>" />


    deswegen steht da ja auch "...;base64,..." :D


    EDIT: base64_encode() NICHT beim INSERT in die db! Nur beim Ausgeben.

  • Du bist der GRÖSSTE, komm her und lass dich küssen oder so !


    Nur ausserhalb vom PHP - Bereich funktioniert das suuuuper, aber wie muss ich das wiedergeben innerhalb von PHP ? Bin schon halb irre geworden mit dem Problem......... :thumbup: :thumbup: :thumbup:


    HTML
    <img src="data:image/jpeg;base64,<?php echo base64_encode($row['Bilddaten']); ?>" />

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!