Come da titolo, sto creando una piccola applicazione che permette di navigare il filesystem del server (dalla root del sito in su) tramite Web, così da trovare una determinata cartella e farvi l'upload di file. Si tratta di un sistema di amministrazione per un sito di immagini.
Il problema con cui mi sto scontrando è quello relativo al posizionamento all'interno del filesystem del puntatore della directory, vi spiego come dovrebbe funzionare l'applicazione:
Lato client viene gestito tramite HTML+AJAX; HTML mostra una finestra con le directory che poi sono dei link creati dinamicamente in javascript, ogni volta che si fa click su una directory viene scatenato l'evento che richiama la nuova posizione all'interno del file system tramite una chiamata AJAX ad un file PHP remoto.
Così ad esempio se faccio click sulla cartella CSS entro in quella cartella.
Lato server c'è un file in PHP che naviga la directory richiesta e ritorna una stringa in formato JSON con l'elenco di ciò che vi ha trovato dentro.
I problemi:
I problemi sono principalmente dovuti al fatto che a salire non ci sono problemi ma a scendere l'albero delle directory non c'è verso di farlo per bene.
In pratica se clicco su FOTO vado dentro FOTO, ma se voglio tornare indietro cliccando su .. (due punti come normalmente si fa da shell) invece di tornarmi indietro di una cartella mi finisce sempre nella Document Root, per me questo comportamento non ha senso e non riesco a comprendere come fare.
Vi mostro il file PHP
Codice PHP:
<?php
/**
* Cerca tra le directory senza iterazione
* Ritorna un array contenente i nomi delle cartelle presenti o false se va in errore.
* Accetta un parametro come percorso iniziale.
*/
function getListDir($cartellaIniziale) {
$cartella = realpath($cartellaIniziale) . DIRECTORY_SEPARATOR;
$dir = array();
$dir[0] = false;
if (chdir($cartella)) {
$c = scandir('.');
$n = count($c);
for ($i = 0;$i < $n; $i++)
if (is_dir($c[$i])) $dir[$i] = $c[$i]; // Inserisce solo le directory.
}
echo '
Seguono in ordine: dump da scandir, risultato delle sole directory.</p><pre>'; var_dump($c, $dir);echo '</pre>
Cartella corrente: ' . getcwd() .
"
Cartella richiesta (via GET): $cartellaIniziale
Percorso da realpath: $cartella</p>";
return $dir;
} // getListDir()
$res = array(0=>false);
$cartella = false;
$filter = array(
'dir' => array('filter' => FILTER_SANITIZE_STRING,
'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY')),
'tipo' => array('filter' => FILTER_SANITIZE_STRING,
'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);
switch ($_SERVER['REQUEST_METHOD']) {
case 'POST':
if (filter_has_var(INPUT_POST, 'dir') && filter_input(INPUT_POST, 'dir') != '') {
$cartella = filter_input_array(INPUT_POST, $filter);
}
break;
case 'GET':
if (filter_has_var(INPUT_GET, 'dir') && filter_input(INPUT_GET, 'dir') != '') {
$cartella = filter_input_array(INPUT_GET, $filter);
}
break;
}
if ($cartella['dir'] !== false) {
if (isset($cartella['dir']) && $cartella['dir'] !== '') {
$res = getListDir($cartella['dir']);
if ($res === false) $res = array(0=>false);
}
}
echo stripslashes(json_encode($res));
?>
In pratica la parte finale mi permette di richiamarlo anche via GET per il debug (normalmente in AJAX uso il post per non far vedere la richiesta sulla barra dell'url) comunque una volta inviata la richiesta in url (esempio: file.php?dir=css) va nella funzione getListDir() e:
1) richiama il realpath aggiungendo pure la barra in ultimo (slash o backslash dipende dal sistema operativo)
2) setta il response per il caso d'errore
3) cambia con la directory (chdir) cercata e se non ci sono errori passa oltre
3a) esegue la scansione della cartella, notare sempre il . perché con chdir sono proprio dentro.
3b) esegue un ciclo per mettere nella risposta solo le directory escludendo gli eventuali file
3b1) sezione di dumping per il debug, ma nonostante ciò ci sto capito mi hai.
4) esce con l'array.
4)esegue la codifica json da restituire
Un esempio di dumping:
URI:
http://10.6.83.211/~marco/dir/getDir.php?dir=./.
Seguono nell'ordine: dump da scandir, risultato delle sole directory.
array(9) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(3) "bin"
[3]=>
string(13) "createDir.php"
[4]=>
string(3) "css"
[5]=>
string(10) "getDir.php"
[6]=>
string(3) "img"
[7]=>
string(17) "inserisciFoto.php"
[8]=>
string(2) "js"
}
array(6) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(3) "bin"
[4]=>
string(3) "css"
[6]=>
string(3) "img"
[8]=>
string(2) "js"
}
Cartella corrente: C:\Apache\users\marco\dir
Cartella richiesta (via GET): ./.
Percorso da realpath: C:\Apache\users\marco\dir\
{"0":".","1":"..","2":"bin","4":"css","6":"img","8 ":"js"}
dando il comando ./. doveva leggermi il la directory dove si trovava in quel momento che era CSS e invece mi è tornato nella root del sito (DIR)
Qualcuno mi può dare una mano?