Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    Creazione del comando dir del dos tramite PHP

    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?

  2. #2
    hai problemi a tornare su?
    Okay, io avevo risolto in un determinato modo... mi passavo come parametro get tutto il path dir con i separatori e poi mi spostavo cambiando alcune cose (separatori, splittavo, etcetera), non era forse il sistema migliore ma funzionava... ora, quando fai un tentativo di salire di un livello prova prima a stampare a video la cartella in cui si trova lo script (magari cerca di ripartire da dove stà lo script).

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Ok nel tardo pomeriggio poi ti faccio sapere.

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    ci sono un po' impazzito, specie lato javascript (che va migliorato e semplificato) ma ora funziona.
    Lo script lato server è questo:
    Codice PHP:
            function getListDir($cartellaIniziale) {
            
    $cartella realpath($cartellaIniziale) . DIRECTORY_SEPARATOR;
            
    $dir = array();
            if (
    chdir($cartella)) {
                
    $filesystem scandir($cartella);
                foreach (
    $filesystem as $c)
                    if (
    is_dir($c) && $c != '.' && $c != '..') {
                        
    $dir[]['dir'] = $c;    //    Inserisce solo le directory.
                    
    }
            }
        return 
    $dir;
        }    
    //    getListDir() 
    Rispetto a quello di prima è semplificato, ma la vera differenza è che non faccio più lo scandir alla directory punto (.) dopo il chdir(), ma dopo il chdir() faccio lo scandir() alla directory da raggiungere trovata tramite realpath.
    In realtà il pattern da passare non è complesso ma bisogna entrare nell'ottica del filesystem o non se ne esce più; in pratica per entrare in una cartella si passa solo il nome di quella cartella, così ad esempio se sto in root/ e voglio andare che so in home, passo come unico parametro home e poi realpth() fa il resto, come deve fare d'altronde.
    Per risalire l'albero, devo sapere dove sono (/home/) e quindi aggiungere i due punti (..) e passare così /home/.. se passo solo i due punti va in balla e non funge perché realpth('..') trova invariabilmente root ed è normale perché la funzione è fatta in modo da trovare il patern assoluto per il percorso dato, e qual'è il percorso per due punti? Bo!
    Ora lo script comunque funge

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.