Explorateur de fichiers

12 Décembre 2013 à 15:07 Lemon Cake

Je ne publierai plus rien sur ce blog. Un nouveau blog existe maintenant. Il se nomme Hardly Smart.

Vous pourrez y retrouver des astuces plus larges sur l'informatique ainsi que mes anciens billets de blog.

Je vous souhaite une bonne lecture sur Hardly Smart.


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 :


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

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.

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>';
            }
        }
    }
}

La mise en forme

* {
    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;
}

Ajoutons un peu d'animation

Pour avoir un peu d'animation on va rajouter quelques lignes de 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");
    });
});

Téléchargement des fichiers

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

// 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;

Conclusion

Sa mise en place est relativement simple :

php

Vous pouvez voir une petite démo :

Demo

2014-04-05 14:25:01

Source

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

Articles liés

Les commentaires ont été désactivés.

4 commentaires

chico 19 Novembre 2018 à 10:23

salut j'ai envie de créer mon propre moteur de recherche pour mon site web mais je n'arrive pas avec la fonction scan, j'ai tous mes fichiers .php dans un dossier du repertoire de mon site web, je peux avoir votre aide s'il vous plait

BaBeuloula 19 Novembre 2018 à 10:42

Salut Chico, il faudra en dire un peu plus car là c'est très dur de t'aider ...

Udeos 28 Mai 2021 à 10:33

Bonjour, votre tuto est très bien pensé mais j'ai quelques problèmes. Lorsque j'utilise la fonction rien ne s'affiche pour ma part. Pour régler le problème j'ai enlevé la fonction et la ça passe. Sinon pour le téléchargement des fichiers ça me télécharge la page sur laquelle l'explorateur est pas un fichier afficher par l'explorateur, est ce normal ?

BaBeuloula 28 Mai 2021 à 10:52

Salut Udeos,
Oui je ne l'ai pas précisé mais il faut appeler ta fonction après l'avoir déclarée. Comme elle prend en paramètre un chemin à scanner, si tu le lui donne pas le dossier primaire à scanner rien ne va se passer.

C'est à dire ça te télécharge la page sur laquelle l'explorateur est ? A la lecture de mon code, je vois que j'ai oublié la balise d'ouverture de PHP (<?php). C'est peut être ça qu'il te manque.

Il faut garder à l'esprit que ce n'est pas parce que tu nommes un fichier avec l'extension .php que PHP va l'interpréter. Il lui faut la balise d'ouverture.

J'espère que ces petits conseils vont t'aider.