Gallerie d'image construite par appels récursifs dans un répertoire

Description

Mise en place d'une méthode de parcours de répertoire par appels récursif permettant la mise en ligne d'une gallerie d'images situées dans un répertoire et ses sous-répertoires. Pour le moment, il n'est implémenté que pour les photos et images. Il est destiné à s'enrichir avec la gestion de différents types de fichiers.

La seule chose à faire est la définition de la constante ROOT en début de code pour donner le répertoire de base de parcours et la limite au dessus de laquelle les visiteurs ne pourront pas aller.

Update du 01/04/2006 :
- Ajout d'une méthode de tri simple sur les sous-répertoires et les fichiers
- Ajout d'un méthode de définition de la constante ROOT en fonction de l'utilisateur connecté (id : Apache / Mandriva par htaccess)
- Intégration dans une archive ZIP contenant les 2 fichiers PHP et le fichier CSS
- Ajout d'un test pour eviter le cross scripting sur le nom du fichier

Source / Exemple :


//////////////////////////////////////////
// DEFINITION DU FICHIER PRINCIPAL DEFINEROOTS.INC.PHP
//////////////////////////////////////////
<?PHP

//Définition des ROOT par usr

$tbRoots = array('MICHEL' => 'Photos',
					'VISITEUR' => 'Photos/Divers',
					'' => '');
?>

//////////////////////////////////////////
// DEFINITION DU FICHIER PRINCIPAL INDEX.PHP
//////////////////////////////////////////
<?PHP
/*
	Date : 30/03/2006
	Auteur : The_Legacy
	Description : 
		Mise en place d'une méthode de parcours de répertoire par appels récursif
		permettant la mise en ligne d'une gallerie d'images situées dans un répertoire et ses sous-répertoires.
		Pour le moment, il n'est implémenté que pour les photos et images. Il est destiné à s'enrichir
		avec la gestion de différents types de fichiers.

  • /
include_once "defineRoots.inc.php"; define('ROOT', $tbRoots[strtoupper($_SERVER['PHP_AUTH_USER'])]); //Définition du répertoire à partir duquel on désire travail et corrspond également à la limite haute de l'arborescence function TableauTrie($tab) { //Méthode simple du tri par permutation $nbElements = count($tab); do { $objTemp = null; $idx = 0; $permutation = false; while ($idx < $nbElements - 1) { if (strtoupper($tab[$idx]->nom) > strtoupper($tab[$idx + 1]->nom)) { if (!$permutation) { $permutation = true; } $objTemp = $tab[$idx]; $tab[$idx] = $tab[$idx + 1]; $tab[$idx + 1] = $objTemp; } $idx++; } }while ($permutation); return $tab; } class Fichier { //Définition d'un objet fichier contenant simplement son nom et son chemin public $nom = ''; public $chemin = ''; function Fichier($chemin) { $this->chemin = $chemin; $tbChemin = explode("/", $chemin); $this->nom = $tbChemin[count($tbChemin) - 1]; } } class repertoire { /* L'objet réperoire contient un tableau d'objets REPERTOIRE correspondants aux sous-répertoire de celui désiré et un autre tableau d'objets FICHIER correspondants aux fichiers contenus dans le répertoire désiré
  • /
public $nom = ''; public $chemin = ''; public $tbSRep = array(); public $tbFiles = array(); function repertoire($chemin, $descendre = true) { /* Le deuxième paramètre du constructeur donne la limite de l'appel récursif s'il est mis à true, cela signifie que l'appel récursif déscendra d'un niveau dans l'arborescence et listera les sous-répertoires de l'élément analysé
  • /
if (is_dir($chemin)) //Vérifier si le chemin existe et est bien un répertoire { //Remplissage des propriétés de l'objet $this->chemin = $chemin; $tbChemin = explode("/", $chemin); $this->nom = $tbChemin[count($tbChemin) - 1]; //Récupération des sous-répertoires $lptRep = opendir($this->chemin); //Ouverture du répertoire désiré $tbRepANePasLister = array('.', '..'); //Liste des sous-répertoires à ne pas lister $tbExtANePasLister = array('db'); //Liste des extensions de fichiers à ne pas lister while (false !== ($obj = readdir($lptRep))) //Parcours des objets contenus dans le répertoire désiré { if (!in_array($obj, $tbRepANePasLister)) //Vérification de la non présence de l'élément dans les éléments à ne pas lister { $cheminObj = $this->chemin.'/'.$obj; if (is_dir($cheminObj)) //Si l'élément est un répertoire, le mettre dans le tableau des sous répertoires { if ($descendre) { //Appel récursif sur le sous-répertoire en cours //Ici, je ne désire pas rentrer dans les sous-répertoires $this->tbSRep[] = new repertoire($cheminObj, false); } } if (is_file($cheminObj)) //Si l'élément est un fichier, je le mets dans le tableau des fichiers { /* Je construit un tableau contenant les éléments consituant le nom de l'objet en cours en général, 2 case : le nom sans l'extension puis l'extension.
  • /
$tbInfosFichiers = explode('.', $obj); if (!in_array($tbInfosFichiers[count($tbInfosFichiers) - 1], $tbExtANePasLister)) { //Ajout de l'objet fichier correspondant $this->tbFiles[] = new Fichier($cheminObj); } } } } closedir($lptRep); //Fermeture du répertoire désiré } else { die("Le chemin spécifié n'est pas un répertoire !"); } } function AfficheArborescence($niveau = 1) { //Parcours tous les sous-répertoires du répertoire en cours //Le paramètre donné peut permettre d'effectuer un affichage décalé des sous-répertoire en fonction du niveau //Par exemple en ajoutant (niveau) fois un espace devant le lien //Le premier test permet de ne pas afficher le nom du répertoire en cours if ($niveau > 1) { //Construction du lien pour le répertoire concerné par l'appel récursif print '<A href="?REP='.$this->chemin.'">'.$this->nom.'</A><BR>'; } //Affichage des sous-répertoires for ($i = 0; $i < count($this->tbSRep); $i++) { //Appel récursif pour l'affichage $srep = $this->tbSRep[$i]; $srep->AfficheArborescence($niveau + 1); } } function ListeFichiers() { //Construction du lien pour les fichiers if (count($this->tbFiles) > 0) { foreach ($this->tbFiles as $fichier) { print '<A href="?'.$_SERVER['QUERY_STRING'].'&file='.$fichier->chemin.'">'.$fichier->nom.'</A><BR>'; } } } function LienParent() { //permet d'afficher le lien pour remonter au répertoire parent de celui consulté //Le premier test permet de ne pas donner la possibilité de remonter au dessus d'un certain répertoire //Dans mon cas le répertoire parent de ROOT est ma racine du serveur Web, je ne désire pas que mes //visiteurs puissent y accéder //Je suis en train de travailler sur la création dynamique du ROOT en fonction du visiteur //Pour éviter par exemple que mes amis n'accèdent à mes photos de famille et inversement if ($this->chemin != ROOT) { //Les 3 lignes qui suivent enlèvent le répertoire en cours du chemin de retour, pour remonter d'un seul niveau $tbPath = explode('/', $this->chemin); array_splice($tbPath, count($tbPath) - 1); $pathOrigine = implode('/', $tbPath); print '<A href="?REP='.$pathOrigine.'">Retour</A><BR>'; } else { //Blanc pour remplir la case du tableau affiché en cas d'inexistence (ou d'inaccessibilité) du répertoire parent print " "; } } } //Récupération des paramètres if (isset($_GET['REP'])) { $path = $_GET['REP']; } else { $path = ROOT; } $rep = new repertoire($path); //Tri des tableaux $rep->tbSRep = TableauTrie($rep->tbSRep); $rep->tbFiles = TableauTrie($rep->tbFiles); $dimensionOrigine = ''; if (isset($_GET['file']) AND is_file($_GET['file'])) { //Pour redimensionner l'image pour un affichage plus "visible" //De manière à en garder le rapport hauteur * largeur //J'utilise cette méthode pour ne pas déformer les photos prises en hauteur en attendant de savoir retourner dynamiquement une photo $image = $_GET['file']; $tbInfos = getimagesize($image); $largeurDesiree = 640; $hauteurDesiree = ($largeurDesiree * $tbInfos[1]) / $tbInfos[0]; $hauteur = $tbInfos[1] * ((($hauteurDesiree * 100) / $tbInfos[1]) / 100); $largeur = $tbInfos[0] * ((($largeurDesiree * 100) / $tbInfos[0]) / 100); //Pour afficher les dimensions originales de l'image $dimensionOrigine = 'Hauteur réelle : '.$tbInfos[1].' pixels    Largeur réelle : '.$tbInfos[0].' pixels'; } ?> <HTML> <HEAD> <TITLE>Les photos</TITLE> <LINK href="styles.css" type="text/css" rel="stylesheet"> </HEAD> <BODY style="text-align:center"> <TABLE width="100%"> <TR valign="top"> <TD colspan="2" align="left"> <SPAN class="tabmenus"><?=$path;?></SPAN> </TD> </TR> <TR> <TD width="200px" nowrap> <TABLE height="100%" width="100%" border="1"> <TR> <TD height="20"><?=$rep->LienParent();?></TD> </TR> <TR> <TD><I>Répertoires :</I><BR><BR><?=$rep->AfficheArborescence();?></TD> </TR> <TR> <TD><I>Images : </I><BR><BR><?=$rep->ListeFichiers();?></TD> </TR> </TABLE> </TD> <TD valign="top"> <?PHP if (isset($_GET['file']) AND is_file($_GET['file'])) { print $dimensionOrigine.'<BR>'; ?> <IMG id="img" src="<?=$image?>" border="0" width="<?=$largeur?>" height="<?=$hauteur?>"> <?PHP } ?> </TD> </TR> </TABLE> </BODY> </HTML>

Conclusion :


Pour le moment, je pense qu'il n'y a pas de bug, mais je ne l'ai pas exploitée à fond.
Merci pour vos commentaires.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.