Marcel: Bild von htaccess-geschütztem Ordner einbinden mit PHP

Hallo zusammen

Ich komme bei einem Problem nicht mehr weiter.
Für eine neue Webseite soll jeder Tag ein neues Bild eingebunden werden auf einer Seite (so nach dem Prinzip "Heutiges Spezialangebot".).
Diese Spezialangebote sollen bereits vorab auf den Server gespeichert werden können, die entsprechenden Verzeichnisse jedoch mit htaccess sperren.

Mit einer datum.php definiere ich jeweils einen String vom aktuellen Tag.
Resultat dann z.B.
$datum = 2009_09_26;

Die Datei data/2009_09_26/daten.htm konnte ich problemlos einbinden.
(morgen wäre dann natürlich automatisch die Datei data/2009_09_27/daten.htm eingebunden...etc.)

Wie schaut dies jedoch bei jpg's oder gif's aus?

das hier geht leider nicht

<?php  
  
include('datum.php');  
$produktabb = "data/" . $datum . "/produkt_abb.jpg";  
include($produktabb);  
  
?>  

Die erzeugt einen Fehler.

  
Warning: Unexpected character in input: ' ' (ASCII=8) state=1 in /home/httpd/vhosts/XXXX/httpdocs/test/data/2009_09_26/produkt_abb.gif on line 47  
Parse error: syntax error, unexpected T_STRING in /home/httpd/vhosts/XXXX/httpdocs/test/data/2009_09_26/produkt_abb.gif on line 47

Was ist hier falsch?
Oder was seht ihr für eine einfache Lösung?
Danke für eure Tipps.

PS: da ich auch noch zwei ältere Produktbilder hinzufügen möchte, kann ich dies dann nach dem selben Prinzip machen...

  1. Was ist hier falsch?

    dein JPG beinhaltet keinen gültigen PHP-Code der von PHP interpretiert werden könnte.

    Oder was seht ihr für eine einfache Lösung?

    Lese die Bilddatei mit PHP und gebe sie auch mit PHP wieder aus - ich würde hierzu z.B. gdlib verwenden.

    Die einfachste Variante ist wohl hier beschrieben:
    imagecreateformjpeg

    Der Vorteil: du kannst dieses Script erweitern (z.B: automatisches zuschneiden, vergrößern oder verkleinern usw).

    1. Die einfachste Variante ist wohl hier beschrieben:
      imagecreateformjpeg

      Leider komme ich da nicht weiter.
      habe nun eine bild.php erstellt mit folgendem Quelltext:

        
        
        
      <?php  
        
      $imgname = "data/2009_09_26/produkt_abb.jpg";  
        
      function LoadJpeg ($imgname) {  
      $im = @ImageCreateFromJPEG ($imgname); /* Versuch, Datei zu öffnen */  
      if (!$im) { /* Prüfen, ob fehlgeschlagen */  
      $im = ImageCreate (150, 30); /* Erzeugen eines leeren Bildes */  
      $bgc = ImageColorAllocate ($im, 255, 255, 255);  
      $tc = ImageColorAllocate ($im, 0, 0, 0);  
      ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);  
      /* Ausgabe einer Fehlermeldung */  
      ImageString($im, 1, 5, 5, "Fehler beim Öffnen von: $imgname", $tc);  
      }  
      return $im;  
      }  
      ?> 
      

      Jetzt kommt einfach eine leese Seite, wenn ichd as öffne.
      Und wenn ich es via

      <img src="bild.php" border="0">

      einbinde, kommt nur das rote Kreuzchen...

      Weiss nicht, was ich nun hier falsch mache :(

      1. Jetzt kommt einfach eine leese Seite, wenn ichd as öffne.
        Weiss nicht, was ich nun hier falsch mache :(

        Der PHP-Interpreter sagt dir das üblicherweise wenn du das Error-Reporting aktivierst.

        1. Der PHP-Interpreter sagt dir das üblicherweise wenn du das Error-Reporting aktivierst.

          Was?... Sorry, kappier ich jett nicht.
          Wenn ich sonst was 'falsch' gemacht habe, dass kommt bei mir ein Fehler.
          Jetzt scheint da die Datei einfach "leer" zu sein.

          Hast du evtl. ein 'fertiges' Beispiel, wie man so ein Bild von einem Unterornder holen gehen kann und dann anzeigen kann als Bild...

          Gruß
          Marcel

          1. Jetzt scheint da die Datei einfach "leer" zu sein.

            Meiner Fehler, siehe Martins Post - dein Code ist OK - nur ausführen tust du ihn nicht :)

      2. Hallo,

        Jetzt kommt einfach eine leese Seite, wenn ichd as öffne.

        ja, genau das erzeugt das Script ja auch: Nichts. Keine Ausgabe.

        Und wenn ich es via

        <img src="bild.php" border="0">

        einbinde, kommt nur das rote Kreuzchen...

        Eben. Dasselbe, als wenn du eine existierende, aber leere Datei (0 Byte) als Bild einbinden möchtest. Dein Script gibt einfach nichts aus - weder den nötigen Header, der die Ressource als Bild kennzeichnet, noch die Nutzdaten selbst.
        Ich frage mich sogar, weshalb du den Code, den du eigentlich direkt ausführen möchtest, noch in eine Funktion kapselst, die du dann nicht aufrufst, d.h. selbst wenn die nötigen Anweisungen da wären, hättest du immer noch keine Ausgabe.

        So long,
         Martin

        --
        Der Klügere gibt solange nach, bis er der Dumme ist.
  2. Ich habs nun geschafft.
    Eigentlich ganz einfach...

    <?PHP  
      
    $image = imagecreatefromjpeg ( 'data/2009_09_26/produkt_abb.jpg' );  
      
    imagepng ( $image );  
    ?>
    

    Danke für eure Tipps.... Gruss, Marcel!

    1. Hallo,

      Ich habs nun geschafft.

      nicht ganz, bis jetzt hast du nur einen Zustand, in dem es dank der Gutmütigkeit der meisten Browser wohl funktioniert.

      imagepng ( $image );

      Und davor fehlt noch die Ausgabe des richtigen Content-Type-Headers, nämlich image/png - sonst lieferst du das Bild mit der Kennzeichnung als text/html aus. Ein Browser, der's penibel genau nimmt, müsste deine Bildressource also immer noch ablehnen.

      Ciao,
       Martin

      --
      Ja, ja ... E.T. wusste schon, warum er wieder nach Hause wollte.
      1. sonst lieferst du das Bild mit der Kennzeichnung als text/html aus. Ein Browser, der's penibel genau nimmt, müsste deine Bildressource also immer noch ablehnen.

        Ich sehe nun das Problem.
        Wenn ich den Quelltext minim abgeändert habe, gehts wirklich wieder nicht mehr:

        <?PHP  
          
        include('datum.php');  
        $image = imagecreatefromjpeg ( 'data/' . $datum . '/produkt_abb.jpg' );  
          
        imagepng ( $image );  
        ?>
        

        Wenn ich die php direkt ausführe, dann kommt 'komischer' Text. Beginn zwar mit "‰PNG   IHDR |þ  ¶Š)ú IDATxœì½é“d×Y7øœí® etc."
        Also ein PNG scheint er zwar erstellt zu haben, aber Ausgabe erfolgt nun per Text.
        Wie kann ich denn das noch mitgenen, dass es klappt?

        1. Hallo,

          sonst lieferst du das Bild mit der Kennzeichnung als text/html aus. Ein Browser, der's penibel genau nimmt, müsste deine Bildressource also immer noch ablehnen.
          Ich sehe nun das Problem.

          ... tust aber nichts dagegen - oder hast du die header-Anweisung nun drin?

          Wenn ich den Quelltext minim abgeändert habe, gehts wirklich wieder nicht mehr:

          <?PHP

          include('datum.php');
          $image = imagecreatefromjpeg ( 'data/' . $datum . '/produkt_abb.jpg' );

          imagepng ( $image );
          ?>

            
          Moooment! Was tut deine datum.php eigentlich? Macht die irgendeine Ausgabe, vielleicht auch nur ein Leerzeichen, einen Zeilenumbruch oder eine BOM? Das wäre in diesem Fall ein KO-Kriterium.  
            
          
          > Wenn ich die php direkt ausführe, dann kommt 'komischer' Text. Beginn zwar mit "‰PNG   IHDR |þ  ¶Š)ú IDATxœì½é“d×Y7øœí® etc."  
            
          Wirklich? Oder kommt noch etwas davor, was du bei der Plaintext-Anzeige nicht siehst?  
            
          
          > Wie kann ich denn das noch mitgenen, dass es klappt?  
            
          Wie ich schon sagte: Indem du noch den richtigen Content-Type-Header sendest und dafür sorgst, dass sonst KEINE! Ausgabe erfolgt.  
            
          Ciao,  
           Martin  
          
          -- 
          F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?  
          A: Mein Arzt hat mir Valium verschrieben.  
          F: Und das hilft?  
          A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.  
          
          
          1. ... tust aber nichts dagegen - oder hast du die header-Anweisung nun drin?

            Wie denn? Weiss wirklich nicht weiter...

            Moooment! Was tut deine datum.php eigentlich? Macht die irgendeine Ausgabe, vielleicht auch nur ein Leerzeichen, einen Zeilenumbruch oder eine BOM? Das wäre in diesem Fall ein KO-Kriterium.

            Die definiert nur eine Veriabel und zwar die $datum, welche so aussieht: 2009_09_26. Somit keine Ausgabe.

            1. Hallo,

              ... tust aber nichts dagegen - oder hast du die header-Anweisung nun drin?
              Wie denn? Weiss wirklich nicht weiter...

              entschuldige, wenn ich zuviel verlange - aber ist es zuviel verlangt, mal das PHP-Manual zu konsultieren?
              Im Abschnitt über imagepng() steht sogar ein komplettes Anwendungsbeispiel. Aber auch bei der Funktion header(), die ich schon namentlich erwähnte, findet man Beispiele zur Verwendung.

              Dass man beim Ausliefern einer HTTP-Ressource prinzipiell einen Content-Type (gelegentlich auch MIME-Type genannt) angeben muss, setze ich selbstverständlich als bekannt voraus. PHP setzt, da in den meisten Fällen HTML generiert wird, als Default den Content-Type text/html, den man selbst überschreiben muss, wenn man eine Ressource eines anderen MIME-Typs ausliefert.

              Moooment! Was tut deine datum.php eigentlich? Macht die irgendeine Ausgabe, vielleicht auch nur ein Leerzeichen, einen Zeilenumbruch oder eine BOM? Das wäre in diesem Fall ein KO-Kriterium.
              Die definiert nur eine Veriabel und zwar die $datum, welche so aussieht: 2009_09_26. Somit keine Ausgabe.

              Du hast mir nicht "zugehört". Gerade deswegen frag' ich doch so provokativ und konkret nach möglichen Leerzeichen/Leerzeilen oder einer BOM noch vor dem <?php.

              So long,
               Martin

              --
              Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
              1. Hi,

                Gerade deswegen frag' ich doch so provokativ und konkret nach möglichen Leerzeichen/Leerzeilen oder einer BOM noch vor dem <?php.

                ... oder natürlich auch noch nach dem abschließenden ?>, das man sicherheitshalber komplett weglassen sollte, falls kein HTML-Output mehr kommen soll.

                Bye,
                 Martin

                --
                Er war ein Mann wie ein Baum. Sie nannten ihn Bonsai.
              2. Hi,

                entschuldige, wenn ich zuviel verlange - aber ist es zuviel verlangt, mal das PHP-Manual zu konsultieren?

                Eigentlich ja, -

                Im Abschnitt über imagepng() steht sogar ein komplettes Anwendungsbeispiel.

                • wenn ihr hartnäckig dabei bleiben wollt, dass diese Funktion zu verwenden wäre.
                  Blaubart hat ja endlich mal darauf hingewiesen, dass es diese Funktion hier überhaupt nicht braucht.

                Aber auch bei der Funktion header(), die ich schon namentlich erwähnte, findet man Beispiele zur Verwendung.

                Die braucht man schon eher.

                Aber anschliessend den Server damit zu belasten, aus einem in Dateiform vorliegenden Bild erst ein GD-Lib-Bildobjekt zu machen, nur um dieses dann wieder in "normaler" Bildform ausgeben zu lassen, ist hyperfluidhochzwei.

                MfG ChrisB

                --
                Light travels faster than sound - that's why most people appear bright until you hear them speak.
                1. Hallo,

                  entschuldige, wenn ich zuviel verlange - aber ist es zuviel verlangt, mal das PHP-Manual zu konsultieren?
                  Eigentlich ja, -

                  ach, ich hätte das für eine Selbstverständlichkeit gehalten. Unabhängig von der Sinnhaftigkeit des Lösungsansatzes.

                  Blaubart hat ja endlich mal darauf hingewiesen, dass es diese Funktion hier überhaupt nicht braucht.

                  Richtig, Marcel hat aber zwischendurch mit seinem Codeauszug auch angedeutet, dass er ggf. den Bildinhalt manipulieren will, z.B. eine Fehlermeldung im Klartext hineinschreiben. Deswegen bin ich bisher mit diesem Ansatz mitgegangen. Ebenso ist mir aufgefallen, dass er JPEG-Bilder liest, dann aber als PNG ausgibt. Auch das ergibt natürlich nur Sinn, wenn man die Bilddaten nicht nur 1:1 durchreicht.

                  Aber anschliessend den Server damit zu belasten, aus einem in Dateiform vorliegenden Bild erst ein GD-Lib-Bildobjekt zu machen, nur um dieses dann wieder in "normaler" Bildform ausgeben zu lassen, ist hyperfluidhochzwei.

                  ACK.

                  Ciao,
                   Martin

                  --
                  Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.
                  1. Hi,

                    Blaubart hat ja endlich mal darauf hingewiesen, dass es diese Funktion hier überhaupt nicht braucht.

                    Richtig, Marcel hat aber zwischendurch mit seinem Codeauszug auch angedeutet, dass er ggf. den Bildinhalt manipulieren will

                    Das sah mir eher so aus, als ob er sich auf den Hinweis auf imagecreateformjpeg hin irgendwo einen Code-Schnippsel besorgt hat, in dem dieses verwendet wird - ohne wirklich von vornherein die unterstellte Absicht zu haben.

                    MfG ChrisB

                    --
                    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    2. Tach.

      Ich habs nun geschafft.
      Eigentlich ganz einfach...

      <?PHP

      $image = imagecreatefromjpeg ( 'data/2009_09_26/produkt_abb.jpg' );

      imagepng ( $image );
      ?>

        
      Es ist nicht nötig, imagecreatefromjpeg() anzuschmeißen, nur um die Datei auszugeben. Für diesen Fall reicht [readfile()](http://www.php.net/manual/en/function.readfile.php).  
      
      -- 
      Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.