GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je afficher les images en dehors du répertoire racine Web dans mon application php ?

PHP par défaut peut déjà accéder aux fichiers en dehors de la racine Web, à moins qu'ils ne soient limités par un open_basedir directive (ou mode sans échec, mais j'espère que vous n'êtes pas dans cette cage).

C'est normalement une bonne pratique d'insérer dans une configuration VirtualHost un open_basedir restriction. Vous pouvez spécifier plusieurs répertoires séparés par : sous Linux et ; sur les fenêtres.

php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir

Pour accéder à ces fichiers, utilisez soit un chemin absolu, soit un chemin relatif à la position du fichier PHP appelé. (Vous devrez donc ../ pour atteindre les niveaux supérieurs).

Assurez-vous également que les répertoires dans lesquels vous souhaitez écrire sont attribués à l'utilisateur du serveur Web et disposent d'une autorisation d'écriture.

Sinon, vous avez la deuxième option :

Dans votre répertoire www, créez un fichier "image.php", avec un contenu similaire à :

<?php
  header('Content-Type: image/png');
  readfile("../img/" . $_GET['img']);
?>

Et appelez vos images avec

<img src="image.php?img=myimage.png" />

Veuillez noter que votre fichier PHP ne devrait pas être aussi simple :) Comme vous voudrez peut-être adresser plusieurs formats d'image (et leur fournir l'en-tête correct), vérifier les chemins/inclusions de fichiers malveillants (vous ne voulez pas utiliser $ _GET sans valider/assainir l'entrée), mise en cache supplémentaire etc. etc. etc.

Mais cela devrait vous donner une idée de la façon dont vous pouvez cibler votre problème.


Aussi simple que cela, cela produira l'image avec des en-têtes corrects,
rappelez-vous que vous devez définir le header() avant de vider quoi que ce soit du tampon de sortie
=> pas d'écho ni d'impression avant

$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);

Pour mon application, aucune de ces réponses ne fonctionnait - je ne pouvais tout simplement pas afficher l'image et il n'était pas vraiment possible pour moi d'ajouter un nouveau fichier php à appeler pour des raisons. Ce qui a fonctionné pour moi, c'est

$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. Comment fonctionnent les composants internes de Sudo ?

  2. Comment installer R 3.3.1 dans le propre répertoire ?

  3. Comment afficher le chemin complet d'un fichier ou d'un répertoire dans le terminal ?

  4. Comment empêcher les utilisateurs d'accéder au répertoire racine ?

  5. Comment mon application C/C++ peut-elle déterminer si l'utilisateur root exécute la commande ?

Comment obtenir la taille d'un répertoire sous Linux

Comment ajouter une application au Dock dans un système d'exploitation élémentaire

Comment changer le répertoire racine du document dans Plesk ?

Quel est le chemin d'accès à mon répertoire racine, comment peut-il être modifié ?

Comment puis-je trouver le fichier le plus ancien dans une arborescence de répertoires

Ajouter un répertoire à la racine Web Apache ?