Hallo,
Dein Code ist allerdings noch deutlich verbesserungswürdig!
Natürlich ist er das, aber er funktioniert muss nur
individalisiert werden. Die wesentlichen Sachen sind aber enthalten.
######################
$hier = $_SERVER['PHP_SELF'];
// Wozu sinnlos kopieren?
Jeder hat seinen Stil und je nach späterer Verwendung
ist das für mich so komfortabler.
$bildverz = 'pics/'; // inkl. slash am Ende
// Eine Definition, zu der du sagen solltest, wie sie zu verstehen ist. Welcher Pfad ist hier anzugeben?
Stimmt
$bildpfad = $_SERVER['DOCUMENT_ROOT'];
// Wieder eine sinnlose Kopie.
Wie ich schon sagte, aufgeräumter und komfortabler
$bildpfad = str_replace('\','/',$bildpfad);
// Wozu das? In $_SERVER['DOCUMENT_ROOT']; sind keine Backslashes enthalten, die man in Slashes wandeln müßte. Wenn doch, dann kann das verwendete XAMP-System damit auch umgehen. Ansonsten würde der Apache nämlich streiken müssen.
Hier irrst du, hatte schon etliche Proble deswegen.
$bildpfad = substr($bildpfad,0,strrpos($bildpfad,'/'));
// Eine undurchsichtige Stringoperation, die von unsicheren Annahmen ausgeht. $_SERVER['DOCUMENT_ROOT'] endet nicht zwingend mit einem Slash, was dir hier dann mehr abschneidet, als du willst...
$bildpfad = $bildpfad.'/'.$bildverz;
// ...nur um am Ende dann zu einem absoluten Pfad zu kommen, der dann doch innerhalb des DOCUMTENT_ROOT liegt, aber einfacher und sinnvoller so definiert würde:
$bildpfad = "/pfad/zum/bild/dir/";
// Das ist einfach und klar verständlich. Und funktioniert immer.
NEIN, man landet oberhalb vom root. Bei deiner Version nicht.
################# Ausgabesteuerung einzelne Bilder #############
if($_GET['pic'])// An dieser Stelle wirft dir PHP eine NOTICE beim Skriptaufruf ohne Parameter, der vermeidbar ist.
Ich weiss, habe mich aber daran gewöhnt wie
die meissten, bin halt auch faul bei sowas und
werde auch in Zukunft, wie die meissten, diese Notice
nicht ignorieren.
if (isset($_GET['pic']) // besser so fragen, ob Variablen definiert sind.
In diesem Fall ja, aber oft will man auch dass was drin steht
und dann ist es einfacher wie ich es mache, trotz notice.
$pic = stripslashes($pic);
// Das darf nur passieren, wenn magic_quotes_gpc auf ON steht.
Ok, könnte man auch noch abfragen.
// Es fehlt eine wirksame Prüfung, ob in $pic nicht ggf. relative Pfadangaben eingeschleppt würden. Die Stringfunktion basename() ist dafür sehr geeignet (auch wenn sie unter Filesystem-Funktionen steht).
// Der Aufruf von clearstatcache() an dieser Stelle ist mehr als sinnlos - er kostet bei Dateimetadatenoperationen (die du nicht benutzt) auch richtig Performance, wenn man ihn unbedacht anwendet.
Wusste ich nicht, im Manual wird konkret darauf bestanden,
nach jeder file_exists() Abfrage.
$pictyp = str_replace('.','',strrchr($pic,'.'));
header('content-type:image/'.$pictyp);// JPEG-Bilder werden typischerweise mit der Endung ".jpg" gespeichert - der ihnen zugeordnete Mime-Typ lautet aber "image/jpeg". Du schickst hier also falsche Headerangaben.
Ups, stimmt hatte ich vergessen, schade.
// Durch die ungeprüfte Weiterreichung von $pic ergibt sich an dieser Stelle ggf. Angriffspotential auf den Benutzerbrowser.
»»
Wüsste jetzt nicht was ich da noch prüfen sollte ?
readfile($bildpfad.$pic);
exit(); // keine weitere Ausgabe// Das Skript wird nur dann abgebrochen, wenn tatsächlich erfolgreich ein Bild gefunden und ausgegeben wurde. In allen anderen Fällen läuft das Skript bei einem Request nach einem Bild weiter in den HTML-generierenden Teil.
Nein soll es nicht, Habe da schon die verrücktesten Sachen
bei den Vor zurück und reload Funktionen des Browsers erlebt.
// Wieder reichlich sinnlose Kopiererei.
// Die Variable $imgs wird nicht initialisiert.
// Die Dateinamen als URL-Parameter werden nicht kodiert!// Die Thumbnail-Generierung ist ausgelassen, der Browser würde die Bilder komplett herunterladen und selbst skalieren müssen.
Ist doch nur ein kurzes Beispiel (steht auch darüber) um
zu zeigen ob das Auslesen überhaubt klappt. Muss jeder für seine
Bedürfnisse anpassen.
Gruss
Wolke