Klaus1: imgapng erzeugt "Grafik kann nicht angezeigt werden, da sie Fehler enthält"

Hallo,

womöglich sehe ich den Wald vor lauter Bäumen nicht, aber ich bekomme es nicht hin, dass mir die erstellte Grafik angezeigt wird.

Ich hab das Script von einem Windows-Server auf einen Linux-Server übertragen. Auf dem Windows-Server läuft es einwandfrei.

Zum Hintergrund: Erstellt werden soll ein Captcha-Bild.

Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser. Die GD-Library ist also installiert und die Berechtigungen passen auch.

Ich habe darauf geachtet, dass keine Leerzeilen oder Kommentarzeilen enthalten sind und sogar versucht vorher alle womöglich vorhandenen header zu entfernen (siehe erste 4 Zeilen). Im Editor sieht die gespeicherte PNG-Datei auch OK aus (PNG-Header und keine PHP-codes).

Ich hoffe, dass Ihr noch einen Tipp oder gar die Lösung für mich habt.

LG Klaus

Hier das Script:


foreach (getallheaders() as $name => $value) {
	header_remove($name);
}
ob_end_clean();
header("Cache-Control: no-cache, must-revalidate");
header('Content-type: image/png');
$characters = "ABCDEFGHJKLMNPRSTUVWXYZabcdefghjkmnprstuvwxyz23456789";
$length = 5;
$code = "";
while( strlen($code) < $length ) {
	$code .= substr($characters, mt_rand() % (strlen($characters)), 1);
}
session_start();
$_SESSION["code"]=$code;
$bg_path = "../images/backgrounds/";
$backgrounds = array(
	$bg_path . '45-degree-fabric.png',
	$bg_path . 'cloth-alike.png',
	$bg_path . 'grey-sandbag.png',
	$bg_path . 'kinda-jean.png',
	$bg_path . 'polyester-lite.png',
	$bg_path . 'stitched-wool.png',
	$bg_path . 'white-carbon.png',
	$bg_path . 'white-wave.png');
$background = $backgrounds[mt_rand(0, count($backgrounds) -1)];
$angle = mt_rand( 0, 10 ) * (mt_rand(0, 1) == 1 ? -1 : 1);
$font_size = 34;
$font = "../font/times_new_yorker.ttf";
$img = imagecreatefrompng($background);
$color = imagecolorallocate($img, 255, 255, 255);
imagettftext($img, $font_size, $angle, 10, 50, $color, $font, $code);
imagepng($img,'../images/test1.png',0,NULL);
imagedestroy($img);
  1. Tach!

    Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser.

    Da wäre jetzt die zu klärende Frage, was der Browser statt des Bildes bekommt. Rechtsklick, Quelltext anzeigen, oder im Netzwerk-Bereich der Browsertools den Request anschauen und prüfen, was da als Response kommt.

    dedlfix.

    1. IE zeigt mr das:

      <html>
      <head>
      </head>
      <body>
      <img width="28" height="30" src="https://meineseite/scripts/captcha.php">
      </body>
      </html>
      
      

      Der Antwort-Header sieht wie folgt aus:

      Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
      Connection: Keep-Alive
      Content-Length: 0
      Content-Type: image/png
      Date: Wed, 31 Oct 2018 07:43:46 GMT
      Expires: Thu, 19 Nov 1981 08:52:00 GMT
      Keep-Alive: timeout=15, max=100
      Pragma: no-cache
      Server: Apache
      

      Alles weitere habe ich bisher noch nie gemacht, da müsste ich dann wissen, wie ich genaueres analysieren kann.

      1. Tach!

        IE zeigt mr das:

        <html>
        <head>
        </head>
        <body>
        <img width="28" height="30" src="https://meineseite/scripts/captcha.php">
        </body>
        </html>
        

        Das ist HTML, kein Bild. Du musst das anschauen, wenn du die Bild-URL aufrufst, nicht das einbettende HTML-Dokument.

        Der Antwort-Header sieht wie folgt aus:

        Der Inhalt muss stimmen, nicht nur die Header. Also schau auch die Response selbst an.

        Content-Length: 0
        

        Aber das sieht sehr verdächtig danach aus, dass der Server gar nichts sendet.

        Wenn es nicht an der inkorrekten Verwendung von imagepng() (Dateinamen angegeben statt null) liegen würde, kann auch bei der Ursachenforschung helfen, Fehlermeldungen einzuschalten, also error_reporting auf E_ALL setzen und display_errors auf true, und dann nochmal die Response anzuschauen.

        dedlfix.

        1. In der FF Netzwerkanalyse steht:

          Status 		200
          Methode 	GET
          Datei 		captcha.php
          Ursprung 	document
          Typ				png
          Übertragen 310 B
          Größe			0
          

          Es sieht also wirklich so aus, als wenn nichts gesendet wird, obwohl die Grafik ja korrekt erstellt und gespeichert wird. Nur warum sendet er die Grafik nicht auch an den Client, denn das folgende Script wird auch im Browser korrekt angezeigt:

              header('Content-type: image/png');
              $myImage = imagecreate(200, 100);
              $myGray = imagecolorallocate($myImage, 204, 204, 204);
              $myBlack = imagecolorallocate($myImage, 0, 0, 0);
              imageline($myImage, 15, 35, 120, 60, $myBlack);
          
              imagepng($myImage);
              imagedestroy($myImage);
          
          

          LG Klaus

  2. Hi,

    Zum Testen speichere ich das Bild ab. Das Bild wird auch korrekt erzeugt und gespeichert und ich kann es mir problemlos anzeigen lassen. Nur eben nicht im Browser.

    ich seh in dem Script nichts, was das Bild an den Browser sendet …

    cu,
    Andreas a/k/a MudGuard

    1. Hi,

      Was müsste ich denn tun, damit eine Augabe erfolgt?

      Und warum funktioniert das folgende Script dann ohne Fehler? Denn da erfolgt ja doch genausowenig eine Ausgabe?

          header('Content-type: image/png');
          $myImage = imagecreate(200, 100);
          $myGray = imagecolorallocate($myImage, 204, 204, 204);
          $myBlack = imagecolorallocate($myImage, 0, 0, 0);
          imageline($myImage, 15, 35, 120, 60, $myBlack);
      
          imagepng($myImage);
          imagedestroy($myImage);
      

      LG Klaus

      1. Tach!

        Was müsste ich denn tun, damit eine Augabe erfolgt?

        imagepng() richtig verwenden.

        Und warum funktioniert das folgende Script dann ohne Fehler? Denn da erfolgt ja doch genausowenig eine Ausgabe?

            imagepng($myImage);
        

        Hier verwendest du imagepng() mit nur einem Parameter, im anderen Code war noch die Angabe eines Dateinamens dabei, der die Ausgabe steuert.

        dedlfix.

        1. Das gibts nicht....

          Ich hatte zu Anfang bei mir auch nur imagepng($img); stehen. Zur Fehleranalyse und in Foren wurde darauf hingewiesen, dass neuere Versionen die Parameter benötigen würden. Jetzt, wo ich die Parameter wieder entfernt habe, funktioniert alles.

          Sehr merkwürdig. Aber ok, hauptsache es funktioniert jetzt und vielen Dank für Eure Unterstützung!

          LG Klaus

          1. Tach!

            Ich hatte zu Anfang bei mir auch nur imagepng($img); stehen. Zur Fehleranalyse und in Foren wurde darauf hingewiesen, dass neuere Versionen die Parameter benötigen würden.

            Die einzige ausschlaggebende Quelle ist das PHP-Handbuch. Auch wenn man Tipps bekommt, darf das nicht die Lektüre der Doku ersetzen. Tipps können beliebig falsch oder unvollständig sein, und das meist nicht aus bösem Willen.

            dedlfix.