PHP per impostazione predefinita può già accedere ai file al di fuori della web root, a meno che non sia limitato da un open_basedir
direttiva (o modalità provvisoria, ma spero che tu non sia in quella gabbia).
Normalmente è buona norma inserire all'interno di una configurazione VirtualHost un open_basedir
restrizione. Puoi specificare più directory separate da :
su Linux e ;
su Windows.
php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir
Per accedere a questi file utilizzare un percorso assoluto o un percorso relativo alla posizione del file PHP richiamato. (Quindi dovrai ../
per raggiungere livelli superiori).
Assicurati inoltre che le directory in cui vuoi scrivere siano assegnate all'utente del server web e dispongano dell'autorizzazione di scrittura.
Altrimenti hai la seconda opzione:
All'interno della tua directory www, crea un file "image.php", con un contenuto simile a:
<?php
header('Content-Type: image/png');
readfile("../img/" . $_GET['img']);
?>
E chiama le tue immagini con
<img src="image.php?img=myimage.png" />
Tieni presente che il tuo file PHP non dovrebbe essere così semplice :) Poiché potresti voler indirizzare più formati di immagine (e fornire loro l'intestazione corretta), verificando la presenza di percorsi/inclusioni di file dannosi (non vuoi usare $ _GET senza convalidare/disinfettare l'input), cache extra ecc. ecc. ecc.
Ma questo dovrebbe darti un'idea su come indirizzare il tuo problema.
Così semplice, questo produrrà l'immagine con le intestazioni corrette,
ricorda che devi impostare header() prima di scaricare qualsiasi cosa dal buffer di output
=> nessun eco o stampa prima
$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);
Per la mia applicazione, nessuna di queste risposte funzionava:semplicemente non riuscivo a visualizzare l'immagine e non era davvero fattibile per me aggiungere un nuovo file php da chiamare per motivi. Quello che ha funzionato per me è
$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'>";
}