PHP Bilder außerhalb des DocumentRoot in img

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.503
Hi, ich habe Bilder außerhalb des DocumentRoots, damit nicht jeder Zugriff auf alle Bilder hat.

Kann ich diese dann irgendwie im img-tag ausgeben?
Kann man das Bild vlt. als handle öffnen und den Inhalt irgendwie innerhalb des img Tags mit rüberbringen?

Nach dem Motto
PHP:
print "<img src='" . readfile(PATH_TO_FILE) . "' />'

Ich weiß, sieht komisch aus, verdeutlicht aber was ich will.
 
Ich habe noch nie ein Alias benutzt, aber es scheint, so, als wären die Bilder dann wieder von jedem erreichbar, oder?
 
Wenn das Bild ausgeliefert werden soll, dann muss es auch abrufbar sein, denn das img-Tag, in das du da schreibst, wird vom Browser ausgeführt, also nicht auf deinem Server. Die einzige Alternative die ich kenne, ist das Bild base64-encodiert zu embedden. Das ist aber sehr ungewöhnlich, d.h. das ist sicherlich nicht das, was du willst.
 
OK, dann noch mal anders.

Ich möchte, dass nur gewisse user gewisse Bilder sehen können und niemand über den Ordner alle Bilder abrufen kann. Die Kriterien, wer was sehen kann würde ich per php auswerten. Kann man das realisieren?

Vielen Dank erstmal
 
Was du tun willst geht schon... aber eben nicht mit <img src="pfad/zum/bild.jpg"> sondern eher mit <img src="image.php?imageid=42">.
Die image.php koppelst du dann mit ner Datenbank, in der die realen Pfade stehen sowie die benötigten Benutzerrechte. Jetzt liest du den Inhalt des Real-Pfades und gibst den passenden Header sowie den Inhalt wieder aus.
 
Wunderbar, das werde ich versuchen, danke euch.
Ergänzung ()

Klappt jetzt alles, außer die Bildausgabe.

Ich habe die <img src="image.php?picID=42"> folgender Maßen aufgebaut:

PHP:
<?php
	$picID = $_GET['picID'];
	if(is_numeric($picID)) {
		header('Content-type: image/png');
		readfile('./../examsdb_pics/examsdb_thumbs/thumb_' . $picID . '.png');
	}
?>

Es kommt aber kein Bild
Ergänzung ()

Sry, klappt alles, nur ein sinnloser Schusselfehler an einer anderen Stelle
 
An dieser Stelle aber nochmal der Hinweis: Solche Konstrukte sind nur Sonderlösungen für spezielle Fälle. Du versaust dir hiermit total die Performance, die du sonst beim Ausliefern von statischen Ressourcen (wie Bildern, CSS,...) hast.

Und ein weiterer Hinweis, auch FÜR die Sonderfälle: Du hast die Cache-Header vergessen. Das kostet wieder Performance und vor allem Bandbreite.
 
Hm, dann überlege ich es mir mal.

Habe folgenden Header zum cachen gefunden
PHP:
header("Cache-Control: public, max-age=60, s-maxage=60");

Die Bilder ändern sich so schnell nicht, soll ich hier jetzt eine endlos große Zeit einstellen, oder wie?
 
Mal n Ausschnitt aus einem unserer Scripts, das dynamisch generierte Bilder ausgibt. $lastmod wird weiter vorn per filemtime() aus dem Ursprungsbild ermittelt.

PHP:
$duration = 30; //cache-zeit in minuten

$exp_gmt = gmdate("D, d M Y H:i:s", time() + $duration * 60) ." GMT";
$mod_gmt = gmdate("D, d M Y H:i:s", $lastmod) ." GMT";

header("Expires: " . $exp_gmt);
header("Last-Modified: " . $mod_gmt);
header("Cache-Control: public, max-age=" . $duration * 60);
// Speziell für MSIE 5
header("Cache-Control: pre-check=" . $duration * 60, FALSE);
 
Zurück
Oben