Jürgen: Bild mit header und imagejpeg wird nicht ausgegeben

Nabend,

habe versucht ein Bild aus der Datenbank mithilfe von gdlib auszugeben, was aber nicht funktioniert. gdlib ist auf dem Webserver aktiv. Habe auch mal probiert ein Bild mit direkter Pfadangabe auszugeben, aber auch das funktioniert nicht. Hier der Code:

<?PHP
$im = ImageCreateFromJPEG("bild.jpg");

Header("Content-type: image/jpeg");
ImageJPEG($im);
ImageDestroy($im);

?>

Ausgabe: ist der Datei-Pfad der PHP-Datei wie sie auf dem Server liegt. Warum wird das Bild nicht ausgegeben? Danke für Hilfe!

  1. Moin!

    habe versucht ein Bild aus der Datenbank mithilfe von gdlib auszugeben, was aber nicht funktioniert. gdlib ist auf dem Webserver aktiv. Habe auch mal probiert ein Bild mit direkter Pfadangabe auszugeben, aber auch das funktioniert nicht.

    Definiere "funktioniert nicht"! Fehlermeldungen? Wenn du das "Bild", was ankommt, speicherst und als Textdatei öffnest, könntest du mehr sehen.

    Abgesehen davon:

    <?PHP
    $im = ImageCreateFromJPEG("bild.jpg");

    Header("Content-type: image/jpeg");
    ImageJPEG($im);
    ImageDestroy($im);

    ?>

    Warum entpackst du das JPEG, und komprimierst es dann erneut? Das macht das Bild nicht besser, und es erfordert Speicherplatz für das gesamte unkomprimierte Bild - was wiederum die mögliche Fehlerquelle sein kann, denn unkomprimiert bedeutet: Auflösung X mal Auflösung Y mal 3 Byte. Bei Bildern mit 2000x3000 Pixeln (6-Megapixel-Klasse) sind das also ganz spontan mal 18 Megabyte, obwohl das JPEG komprimiert vielleicht nur 2 MB groß ist. Wenn PHP soviel Speicher nicht nutzen darf, gibts statt eines Bildes nur eine Fehlermeldung.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Erstmal danke das jemand reagiert. Also Ziel ist ein Bild (BLOB) aus einer Datenbank darzustellen. Das funktioniert aber nicht, daher habe ich jetzt einfach mal probiert ein Bild zu erzeugen und das darzustellen. Soll einfach zeigen ob das wenigstens funktioniert. Diese Dinge sind neu für mich.

      header("Content-Type: image/jpeg");

      echo readfile($foto);
           exit();

      So sähe jetzt der Quelltext aus um das Bild (jpeg) das als BLOB in der Datenbank liegt (es ist definitiv da und auch in der Variable) im Browser anzuzeigen. Ich habe schon x-Versuche unternommmen. (z.B. print $foto->load(), mit zusätzliche header usw.) Aber das Ergebnis ist eigentlich immer das gleiche: Es wird einfach die Adresse der php-Datei im Browser angezeigt. Es gibt keine PHP-Fehler und auch keine DB-Fehler, aus der das Bild problemlos geladen wird. Was mache ich falsch?

      Wenn mir dabei keiner weiterhelfen kann, wie sähe denn konkret der Quelltext aus um ein Bild zu erzeugen und anzuzeigen mit der gdlib?

      Liegts vielleicht am Browser? Firefeox 2.0? Ich weiß nicht mehr weiter.

      Bin jedem sehr dankbar für Hilfe!

      1. (...)Aber das Ergebnis ist eigentlich immer das gleiche: Es wird einfach die Adresse der php-Datei im Browser angezeigt. Es gibt keine PHP-Fehler und auch keine DB-Fehler, aus der das Bild problemlos geladen wird. Was mache ich falsch?

        Wenn du den Content-Type auf eine Bild-Resurce legst, dann kann dein Browser keiner Fehler auslesen. Sie stehen zwar in der Resurce, aber die ist nicht gültig (kein echtes Bild).
        Kommentiere die Header-Definition aus und ruf die Datei mit deinem Browser auf, dann werden die Fehlermeldungen auch angezeigt.

        1. Habe die Header-Definition rausgenommen und an den Dateianfang  error_reporting(E_ALL); geschrieben. Da kommt dann aber nichts.

          Zur Info: Wenn ich print $foto->load() einsetze und die Header-Definition rausneheme, wird mir die Binärdatei als Zahlenwirr-warr dargestellt, also ist sie auch da. Nur kommt sie nicht als Bild an.

      2. hi,

        Aber das Ergebnis ist eigentlich immer das gleiche: Es wird einfach die Adresse der php-Datei im Browser angezeigt. Es gibt keine PHP-Fehler und auch keine DB-Fehler, aus der das Bild problemlos geladen wird. Was mache ich falsch?

        Kannst du dazu bitte mal ein Online-Beispiel bereitstellen?

        Es ist keinerlei plausibler Grund erkennbar, warum dass den URL der Ressource anzeigen sollte - also entweder spinnt dein Browser oder dein Server.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Morgen,

          leider habe ich das nur auf meinem lokalen Server laufen. Auf Webspace habe ich keine Möglichkeit auf die Oracle-Datenbank zuzugreifen. Hier aber mal der vollständige Quellcode:

          <?php

          ----Verbindungsdaten würden hier stehen.

          $con = oci_connect($user, $password, $database);

          $con = oci_connect($user, $password, $database);
          $result=OCIParse($con, "select FOTO from person where personid = 70");
          OCIExecute($result);
          OCIFetch($result);
          $foto=OCIResult($result, "FOTO");

          $err2=OCIError($result);
          if($err2==TRUE){ echo " <font size=2>Oracle-Fehler: $err2[message]</font><br> ";}

          header("Content-type: image/jpeg");

          echo readfile($foto);
               exit();

          ?>

          Es ist wirklich zum Verzweifeln.  Wie gesagt, mit print $foto->load() und OHNE header-Information würde die Binärdatei als Zahlen-wirwarr dargestellt werden. Mit print $foto->load() UND header-Information aber wieder nur der Pfad der PHP-Datei.

          1. hi,

            leider habe ich das nur auf meinem lokalen Server laufen. Auf Webspace habe ich keine Möglichkeit auf die Oracle-Datenbank zuzugreifen.

            Stelle bitte das einfache Beispiel mit den GD-Lib-Funktionen online - da passiert ja nach deiner vorherigen Aussage das gleiche.

            Es ist wirklich zum Verzweifeln.  Wie gesagt, mit print $foto->load() und OHNE header-Information würde die Binärdatei als Zahlen-wirwarr dargestellt werden. Mit print $foto->load() UND header-Information aber wieder nur der Pfad der PHP-Datei.

            Dann baut vermutlich wirklich einer der beiden Beteiligten, Server oder Client, ziemlichen Mist.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
          2. echo $begrüßung;

            echo readfile($foto);

            readfile() gibt die Daten direkt an den Ausgabepuffer (sprich: Richtung Browser) aus. Der Rückgabewert ist im Erfolgsfall die Anzahl der gelesenen Bytes. Diese möchtest du sicherlich nicht ausgeben.

            echo "$verabschiedung $name";

  2. DANKE für den Hinweis!

    Ich kann es nicht glauben, aber ES FUNKTIONIERT!!!! Online hat es direkt geklappt, mit neuer Datei, wo ich einfach den Quellcode mit dem imagecreate und und imagejpeg reinkopiert habe. Dann habe ich es lokal probiert und schlussendlich den Fehler gefunden: Vor "<?PHP" war noch eine verdammte Leerzeile die alles vermasselt hat.

    Etwas weiter probiert und jetzt klappts auch mit dem Bild aus der DB!

    VIELEN DANK!