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