12/12/2013 | 3 min. (597 words)

Explorateur de fichiers

Il y a quelques jours je vous parlais d’un petit plugin sympa pour parcourir un dossier et ses sous-dossiers. Le système est très pratique mais je me suis aperçu qu’il comportait une grosse faille de sécurité. En effet, il suffisait de faire une petite injection JavaScript via la console du navigateur et vous aviez accès aux dossiers que vous n’auriez jamais pu voir.

Je me suis alors dis que plutôt que de m’amuser à sécuriser le tout, j’ai recréer un système identique mais cette fois beaucoup plus sécurisé. Et du coup cela fera un tuto pour vous montrer comment parcourir un dossier un PHP.

Prérequis

Pour réaliser cet explorateur de fichiers vous devrez avoir :
  • Un serveur web avec PHP 5 ou supérieur
  • La bibliothèque JavaScript jQuery
  • Et savoir lire (mais bon si vous êtes ici c’est sans doute pas pour les images)

Scan des dossiers

Pour trouver le contenu d’un dossier en PHP, il y a plusieurs solutions. La plus simple est la fonction scandir() mais demande d’avoir PHP5 sur son serveur. Cette fonction s’utilise de la façon suivante :

[php]

// On passe en paramètre le dossier à scanner // On récupère le contenu du dossier dans un tableau $files = scandir(‘./repertoire/’);

[/php]

Création de la fonction de scan

Nous allons passer maintenant à la création de la fonction qui va scanner automatiquement les dossiers et ses sous dossiers.

[php] function scan($dir) { // On regarde déjà si le dossier existe if(is_dir($dir)) { // On le scan et on récupère dans un tableau le nom des fichiers et des dossiers $files = scandir($dir);

    // On supprime . et .. qui sont respectivement le dossier courant et le dossier précédent
    unset($files[0], $files[1]);

    // On tri le tableau de façon intéligente (à la façon humaine)
    // http://www.php.net/function.natcasesort
    natcasesort($files);

    // On commence par afficher les dossiers
    foreach($files as $f) {
        // S'il y a un dossier
        if(is_dir($dir.$f)) {
            // On affiche alors les données
            echo '<li class="folder">'.$f.'</li>';
            echo '<ul class="tree">';

            // Et du coup comme c'est un dossier, un le rescan
            scan($dir.$f."/");

            echo '</ul>';
        }
    }

    // Puis on affiche les fichiers
    foreach($files as $f) {
        // S'il y a un fichier
        if(is_file($dir.$f)) {
            echo '<li class="file" rel="'.$dir.$f.'">'.$f.'</li>';
        }
    }
}

} [/php]

La mise en forme

[css] * { font-family : ‘Arial’, sans-serif; font-size : 12px; }

ul { list-style : none; margin : 0px; padding : 0px; padding-left : 25px; }

li { padding-left : 20px; line-height : 18px; cursor : pointer; }

li.folder { background : url("folder.png") no-repeat left center; }

li.file { background : url("file.png") no-repeat left center; } [/css]

Ajoutons un peu d’animation

Pour avoir un peu d’animation on va rajouter quelques lignes de JavaScript

[javascript] jQuery(function($){ // On commence par cacher tous les sous dossiers $("ul.tree").hide();

// Lors du click du un dossier
$("li.folder").click(function () {
    // Si le dossier n'est pas ouvert on l'ouvre, sinon, on le ferme
    $(this).next("ul").toggle("fast");
});

// Lors du click sur un fichier
$("li.file").click(function () {
    // On lance le téléchargement du fichier
    document.location = "dl.php?f="+$(this).attr("rel");
});

}); [/javascript]

Téléchargement des fichiers

Voici un petit script PHP pour télécharger le fichier qu’on lui passera en paramètre

[php] // La fonction end(), permet de récupérer le dernier objet d’un tableau // http://cz1.php.net/function.end

$file = explode("/", $_GET[‘f’]);

header(‘Content-Description: File Transfer’); header(‘Content-Type: application/octet-stream’); header(‘Content-Disposition: attachment; filename=’ . basename(end($file))); header(‘Content-Transfer-Encoding: binary’); header(‘Expires: 0’); header(‘Cache-Control: must-revalidate’); header(‘Pragma: public’); header(‘Content-Length: ‘ . filesize($_GET[‘f’])); ob_clean(); flush();

readfile($_GET[‘f’]); exit; [/php]

Conclusion

Sa mise en place est relativement simple :

[php] <?php scan("./repertoire/"); ?>[/php]

Vous pouvez voir une petite démo :

Démo

2014-04-05 14:25:01

Source

http://lemon-cake.fr/?p=246

JavaScript jQuery PHP Tutoriaux
Twitter Facebook Google+

Minimiser des scripts Javascript en PHP

Voici comment grâce à la classe PHP JSMin, comment minimiser en quelques lignes des scripts JavaScript.…

Bibliothèque d'icônes gratuite

Ne cherchez plus, voici l'une des plus grande bibliothèque d'icônes…

A forked FR theme of Bleak by zutrinken Published with Hugo
Menu
    • Démo
    • Source