PHP kann standardmäßig bereits auf Dateien außerhalb des Webstammverzeichnisses zugreifen, sofern dies nicht durch einen open_basedir
eingeschränkt wird Direktive (oder abgesicherter Modus, aber ich hoffe, Sie sind nicht in diesem Käfig).
Normalerweise empfiehlt es sich, innerhalb einer VirtualHost-Konfiguration einen open_basedir
einzufügen Beschränkung. Sie können mehrere Verzeichnisse getrennt durch :
angeben unter Linux und ;
unter Windows.
php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir
Um auf diese Dateien zuzugreifen, verwenden Sie entweder einen absoluten Pfad oder einen Pfad relativ zur Position der aufgerufenen PHP-Datei. (Sie müssen also ../
höhere Ebenen zu erreichen).
Stellen Sie außerdem sicher, dass Verzeichnisse, in die Sie schreiben möchten, dem Webserver-Benutzer zugewiesen sind und Schreibrechte haben.
Andernfalls haben Sie die zweite Möglichkeit:
Erstellen Sie in Ihrem www-Verzeichnis eine "image.php"-Datei mit ähnlichem Inhalt wie:
<?php
header('Content-Type: image/png');
readfile("../img/" . $_GET['img']);
?>
Und rufen Sie Ihre Bilder mit
auf<img src="image.php?img=myimage.png" />
Bitte beachten Sie, dass Ihre PHP-Datei nicht so einfach sein sollte :) Da Sie möglicherweise mehrere Bildformate adressieren (und den richtigen Header dafür bereitstellen) möchten, suchen Sie nach schädlichen Dateipfaden/Einschlüssen (Sie möchten nicht $ _GET ohne Validierung/Bereinigung der Eingabe), zusätzliches Caching usw. usw. usw.
Aber das sollte Ihnen eine Vorstellung davon geben, wie Sie Ihr Problem angehen können.
So einfach wird das Bild mit korrekten Headern ausgegeben,
Denken Sie daran, dass Sie header() setzen müssen, bevor Sie etwas aus dem Ausgabepuffer löschen
=> vorher kein Echo oder Druck
$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);
Für meine Anwendung funktionierte keine dieser Antworten - ich konnte das Bild einfach nicht anzeigen und es war für mich aus Gründen nicht wirklich möglich, eine neue PHP-Datei zum Aufrufen hinzuzufügen. Was für mich funktioniert hat, ist
$filename = read_filename_from_database;
$fileDir = "/path/to/files/";
$file = $fileDir . $filename;
if (file_exists($file))
{
$b64image = base64_encode(file_get_contents($file));
echo "<img src = 'data:image/png;base64,$b64image'>";
}