robertroth: Geänderter Code zu "Selbstgebasteltes Skript zum Verkleinern von Grafiken erzeugt keine Thumbnails"

Beitrag lesen

Lieber Enrico, liebe Mitdenker, liebe Wissende, liebe Neugierige,

und hier der neue Code, den ich nun direkt mit Parametern aufrufe:

Und was ist damit? Läuft der nun so, wie Du wolltest?
Mir sind einige Dinge aufgefallen. Ich weiß leider noch nicht, wie ich die Bemerkungen in deinen Code reinbringen kann, ohne dass die Formatierung nachher flöten geht, aber ich will es mal versuchen.

   $Ausgangsgrafik = $_GET["A"];  

Umkopieren ist nicht notwendig, aber prüfen auf einen erlaubten Pfad ist wichtig, damit dein Script nicht zur Sicherheitslücke wird. Du übergibst übrigens (oben im Thread) "G=../IMG/bildname.png" und fragst hier nach $_GET['A'].

Außerdem solltest Du auch danach fragen "if (isset($_GET['G']))"

if (isset ($_GET["B"])) $Maximale_Breite = $_GET["B"];

Hier erst umwandeln in Integer und dann Werte kleiner Minimalbreite ablehnen

if (isset ($_GET["H"])) $Maximale_Hoehe = $_GET["H"];

Hier auch umwandeln in Integer und dann Werte kleine Minimalhöhe ablehnen

$Informationen = getimagesize ($Ausgangsgrafik);

getimagesize() liefert auch einen Fehlerwert, wenn das Grafikfile nicht auswertbar ist

$Urspruengliche_Breite = $Informationen[0]; $Urspruengliche_Hoehe = $Informationen[1];

Die sind nur vorhanden, wenn getimagesize() vorher geklappt hat

if ($Maximale_Breite) $Faktor = $Maximale_Breite / $Urspruengliche_Breite; else if ($Maximale_Hoehe) $Faktor = $Maximale_Hoehe / $Urspruengliche_Hoehe;

$Neue_Breite = round ($Urspruengliche_Breite * $Faktor); $Neue_Hoehe = round ($Urspruengliche_Hoehe * $Faktor);

$Kopie = imagecreatefrompng ($Ausgangsgrafik);

Woher weißt Du, dass es eine PNG-Grafik war?

Man kann auch imagecreatefromstring() benutzen, das erkennt selber, was für ein Bildtyp vorliegt. Außerdem kann man dann vorher die Datei einlesen mit fread() und prüfen, ob das klappt, dann muss man das TOCTOU-Anfällige file_exists() nicht benutzen. Dann kann man darauf auch getimagesizefromstring() anwenden, wenn die PHP-Version >= 5.4.0 ist. Dadurch muss dann nur ein einziger HDD-Zugriff erfolgen, während deine Methode ( file_exists(), getimagesize(), imagecreatefrom***() ) drei Zugriffe erfordert. (Ok, wenn PHP das file cached hat, ist es vermutlich egal, aber da steckt man nicht drin, ... )

$Verkleinerte_Kopie = imagecreatetruecolor ($Neue_Breite, $Neue_Hoehe); $Transparenz = imagecolortransparent ($Kopie);

if ($Transparenz != -1) { $Transparente_Farbe = imagecolorsforindex ($Kopie, $Transparenz); $Transparenz = imagecolorallocate ($Verkleinerte_Kopie, $Transparente_Farbe["red"], $Transparente_Farbe["green"], $Transparente_Farbe["blue"]); imagefill ($Verkleinerte_Kopie, 0, 0, $Transparenz); imagecolortransparent ($Verkleinerte_Kopie, $Transparenz); } else { imagealphablending ($Verkleinerte_Kopie, false); $Alpha = imagecolorallocatealpha ($Verkleinerte_Kopie, 0, 0, 0, 127); imagefill ($Verkleinerte_Kopie, 0, 0, $Alpha); imagesavealpha ($Verkleinerte_Kopie, true); }

imagecopyresampled ($Verkleinerte_Kopie, $Kopie, 0, 0, 0, 0, $Neue_Breite, $Neue_Hoehe, $Urspruengliche_Breite, $Urspruengliche_Hoehe);

header ("Content-type: IMAGETYPE_PNG"); imagepng ($Verkleinerte_Kopie, null);

Da Du ein eigenes Skript daraus machst, kannst Du in diesem Skript auch eigene Funktionen erstellen. Das vereinfacht und verbessert die Steuerung des Programmablaufes - also aufteilen in einzelne Funktionen mit definierter Aufgabe.

Die übrigen Dinge lasse ich erst einmal ohne Kommentar. Ich will dich ja nicht ärgern :-)

Und noch eine Idee für Dich:

Du kannst den Aufruf des Skriptes per .htaccess steuern:

Die Umleitung auf das Skript kannst Du mit einer Rewrite-Rule in einer .htaccess-Datei vornehmen. Wenn Du schreibst <img src="/images/meinbild.jpg" ...>, dann wird das Originalbild ausgeliefert und wenn Du schreibst <img src="/thumbs/meinbild.jpg" ...>, dann wird auf dein Skript umgeleitet, weil "/thumbs/" im Pfad steht und das in der Rewrite-Rule so festgelegt wird. Und das Skript weiß dann selber, dass es das Image in /images/ zu suchen hat (weil das von Dir so festgelegt wurde) und liefert es verkleinert aus.

Das hat den Vorteil, dass dein Skript "geheim" bleibt, also der Name nach außen hin gar nicht erst publik gemacht wird.

Spirituelle Grüße
Euer Robert
robert.r@online.de

--
Möge der wahre Forumsgeist ewig leben!