PHP de forma predeterminada ya puede acceder a archivos fuera de la raíz web, a menos que esté restringido con un open_basedir
directiva (o modo seguro, pero espero que no estés en esa jaula).
Normalmente es una buena práctica insertar dentro de una configuración de VirtualHost un open_basedir
restricción. Puede especificar varios directorios separados por :
en Linux y ;
en ventanas.
php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir
Para acceder a esos archivos, use una ruta absoluta o una ruta relativa a la posición del archivo PHP llamado. (Así que tendrás que ../
para alcanzar los niveles superiores).
También asegúrese de que los directorios en los que desea escribir estén asignados al usuario del servidor web y tengan permiso de escritura.
De lo contrario, tiene una segunda opción:
Dentro de su directorio www, cree un archivo "image.php", con un contenido similar a:
<?php
header('Content-Type: image/png');
readfile("../img/" . $_GET['img']);
?>
Y llama a tus imágenes con
<img src="image.php?img=myimage.png" />
Tenga en cuenta que su archivo PHP no debería ser tan simple :) Como es posible que desee abordar múltiples formatos de imagen (y proporcionar el encabezado correcto para ellos), verificar la ruta/inclusiones de archivos maliciosos (no desea usar $ _GET sin validar/desinfectar la entrada), almacenamiento en caché adicional, etc. etc. etc.
Pero esto debería darle una idea de cómo puede abordar su problema.
Tan simple como eso, esto generará la imagen con los encabezados correctos,
recuerde que debe configurar el encabezado () antes de eliminar cualquier cosa del búfer de salida
=> sin eco ni impresión antes
$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);
Para mi aplicación, ninguna de esas respuestas funcionaba:simplemente no podía mostrar la imagen y no era realmente factible para mí agregar un nuevo archivo php para llamar por razones. Lo que SÍ funcionó para mí es
$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'>";
}