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

Soyez le premier à donner votre avis sur cette source.

Vue 8 224 fois - Téléchargée 956 fois

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

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
15 juin 2006

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home.2/capbeaut/www/index.php on line 44

Voici mon erreur :'(
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Rien ne me choque... mais en faisant une permutation comme ca il faut mentionner que ton script est pour PHP5 car il fonctionne par référence, sinon tu fais une copie en PHP4... pour ne pas faire de copie tu dois écrire une perluète (&) après le =.

Fonction usort permet de trier en fonction d'un callback.
Messages postés
28
Date d'inscription
mercredi 6 juin 2001
Statut
Membre
Dernière intervention
3 mars 2009

Salut,

Oui en effet, désolé pour les notations courtes, j'ai tout corrigé avant que tu me le signales mais je n'ai pas eu le temps de faire un update.

Concernant la permutation, qu'est-ce qui te choque ? Elle me permet de permuter de Objets pour les trier. Au passage, je n'ai trouvé aucune fonction PHP permettant de trier des objets en fonction d'une proporiété. Si tu en connais une, cela m'intéresse.
Perso, c'est comme ca que j'ai appris à trier (tri simple, avant tri fusion et dycho) quand j'ai appris le C, C++.

Merci de cos commentaires.
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
Attention, c'est du PHP5, PHP4 tu fais des copies ici :
$objTemp = $tab[$idx];
$tab[$idx] = $tab[$idx + 1];
$tab[$idx + 1] = $objTemp;

Ta fonction de sorting (permutation) est vraiment étrange... il y a des fonctions PHP qui permettent de faire du tri en lui fournissant un callback...

"<?=$hauteur?>"> WOUAAAAAA C'est vieux ca !!! un petit <?php echo serait apprécié.
Messages postés
28
Date d'inscription
mercredi 6 juin 2001
Statut
Membre
Dernière intervention
3 mars 2009

Evangun : Oui désolé, j'ai pas fait attention :)

Sniogleerf : Normalement il faut que tu définisses un répertoire de base à mettre dans la constante ROOT. Soit tu le mets en dur dedans, soit tu passe par le tableau associatif par rapport aux noms d'utilisateurs déclaré dans le include associé. Si tu as fait un copier-coller du code ci-dessus, le plus simple est de le mettre en dur, sinon récupère le ZIP tu as tout dedans.

Merci pour vos commentaires, c'est ma première source en PHP alors tout est bon à prendre pour apprendre parfaitement.
Afficher les 7 commentaires

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.