GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich die Bilder außerhalb des Web-Root-Verzeichnisses in meiner PHP-Anwendung anzeigen?

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'>";
}

Linux
  1. Wie installiere ich R 3.3.1 im eigenen Verzeichnis?

  2. Wie zeigt man den vollständigen Pfad einer Datei oder eines Verzeichnisses im Terminal an?

  3. Wie kann man verhindern, dass Benutzer auf das Root-Verzeichnis zugreifen?

  4. Wie kann meine C/C++-Anwendung feststellen, ob der Root-Benutzer den Befehl ausführt?

  5. Wie kann ich PHP-Code von der Kommandozeile aus ausführen?

So erhalten Sie die Größe eines Verzeichnisses in Linux

So fügen Sie eine Anwendung zum Dock in einem elementaren Betriebssystem hinzu

Wie funktionieren die Interna von Sudo?

Wie ändere ich das Dokumentstammverzeichnis in Plesk?

Wie lautet der Pfad zu meinem Root-Home-Verzeichnis, wie kann er geändert werden?

Wie kann ich die Ausgabe einer Shell-Anwendung in Linux ausblenden?