Page 1 sur 1

afficher images d'un repertoire

Posté : 12 juin 2009, 17:45
par fabrice88250
bonjour,

Bon j'avance doucement dans ma recherche mais là je bloc.
Alors voilà, j'arrive à parcourir le contenu de mon répertoire, j'affiche les images qui sont dedans et je les réduis pour qu'elles aient la taille que je souhaite.

J’ai donc toutes mes image qui s'affiche les une derrière les autre (on verra après pour la mise en page) et j'ai en tête de page le nom des sous répertoire qui s'affiche si il y en a dans le dossier.

Mon soucis et que si je clic sur le nom du sous répertoire au lieu d'explorer le contenu je tombe sur :
Error 403 - Forbidden
L'accès au fichier requiert une autorisation.

Comment puis-je faire pour que lorsque je clique sur le lien du sous répertoire je l'ouvre et je l'explorer tout comme le répertoire source ?


voici le code sur lequel je suis en trai de travaillé :
<?php
$dir_nom = '../images'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.'  --> ('point')
$dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
$fichier= array(); // on déclare le tableau contenant le nom des fichiers
$dossier= array(); // on déclare le tableau contenant le nom des dossiers

while($element = readdir($dir)) {
	if($element != '.' && $element != '..') {
		if (!is_dir($dir_nom.'/'.$element)) {$fichier[] = $element;}
		else {$dossier[] = $element;}
	}
}

closedir($dir);

if(!empty($dossier)) {
	sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
	echo "Liste des dossiers accessibles dans '$dir_nom' : \n\n";
	echo "\t\t<ul>\n";
		foreach($dossier as $lien){
			echo "\t\t\t<li><a href=\"$dir_nom/$lien \">$lien</a></li>\n";
		}
	echo "\t\t</ul>";
}

if(!empty($fichier)){
	sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
	echo "Liste des fichiers/documents accessibles dans '$dir_nom' : \n\n";
	echo "\t\t<ul>\n";
		foreach($fichier as $lien) {
			$size = GetImageSize("$dir_nom/$lien");
			
	//Largeur maximale de l'image pour la cr&eacute;ation des miniatures 
    $largeur_maxi = 100; 
    if ($size[0] > $largeur_maxi) 
        { 
            $width = $largeur_maxi; 
            $theight = ($size[0]/$largeur_maxi); 
            $height = ($size[1]/$theight); 
        } 
    else 
        { 
            //Sinon on garde la taille originale 
            $width = $size[0]; $height = $size[1]; 
        } 
			echo "\t\t\t<li><a href=\"$dir_nom/$lien \"><img src=\"$dir_nom/$lien \" width=".$width." height=".$height." alt=\"Photo des Vosges : $lien\" /></a></li>\n";
			
			echo  $size[0]. 'x' .$size[1] ;
		}
	echo "\t\t</ul>";
 }
?>
pouvez vous m'aider ?[/code]

Posté : 12 juin 2009, 19:44
par micetf
Bonjour,

Ici (http://php.developpez.com/sources/?page ... listimages) on t'explique comment lister et afficher les images d'un dossier.
Et là (http://php.developpez.com/sources/?page ... #listereps) comment lister un répertoire et ses sous répertoires.
En utilisant ça, je pense que c'est possible.

Fred

Posté : 12 juin 2009, 21:14
par micetf
Bonsoir,

J'avais répondu à une demande bien plus succinte que celle qui s'affiche maintenant ???

Je vois que tu as bien avancé.

J'ai essayé ceci avec ton script : je suis passé par la variable $_GET.

Au début du script, je récupère le dossier à parcourir :
$dir_nom = (isset($_GET['dir'])) ? $_GET['dir'] : './images'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.'  --> ('point')
Et lorsque j'affiche les dossiers, au lieu de mettre un lien vers le dossier, je rappelle mon script en lui passant le nom du dossier dans l'URL (?dir=$dir_nom/$lien).
if(!empty($dossier)) {
    sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
    echo "Liste des dossiers accessibles dans '$dir_nom' : \n\n";
    echo "\t\t<ul>\n";
        foreach($dossier as $lien){
            echo "\t\t\t<li><a href=\"affImgDir.php?dir=$dir_nom/$lien \">$lien</a></li>\n";
        }
    echo "\t\t</ul>";
}
Et ça marche.

Fred

Posté : 13 juin 2009, 10:54
par fabrice88250
bonjour, merci pour ton aide mais j'ai essayé ta solution et j'ai toutjours le meme probleme chez moi
Si je clique sur un des liens repertoire j'ai toujours :

Error 404 - Not found
Le fichier requis n'a pas été trouvé. Il peut s'agir d'une erreur technique. Veuillez réessayer ultérieurement. Si vous ne pouvez pas accéder au fichier après plusieurs tentatives, cela signifie qu'il a été supprimé

l'adresse recuperée est :
http://www.monsite.com/pages/affImgDir. ... noramiques

Posté : 13 juin 2009, 11:01
par micetf
Tu dois remplacer affImgDir par le nom de ton script.
affImgDir.php est le nom que j'ai utilisé pour faire mes tests,
tu n'as vraisemblablement pas utilisé le même nom.
Fred

Posté : 13 juin 2009, 11:24
par fabrice88250
ah j'avais bien changer le nom mais j'avais oublié un 's'.
Merci sa fonctionne.

pense tu qu'il est possible de remplacer les lien des repertoires par une des images qui est contenu dans le repertoire ?
autre question serrait-il possible d'ajouter un commentaire ou un explication sur le contenu du repertoire tout en stochant dans mysql le commentaire lié au repertoire.

Posté : 13 juin 2009, 12:04
par micetf
Il n'y a pas de raison pour que tu ne puisses pas le faire.

Dans la boucle où tu affiches tes dossiers (foreach($dossier as $lien)),
pour chaque dossier, tu listes les images
qu'il contient comme tu l'as fait pour le dossier racine,
Note : Peut-être pourrait tu créer une fonction lireDossier($dir_nom), pour éviter de réécrire du code ?

puis au lieu d'afficher le nom du répertoire ($lien),
tu affiches une des images : <img src="'.$dir_nom.'/'.$lien.'/'.uneImageDuSousDossier.'"/>.

Voilà ce que j'ai testé très rapidement :
// Fonction pour parcourir les dossiers
function lireDossier($dir_nom) {
	$dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
	$fichier= array(); // on déclare le tableau contenant le nom des fichiers
	$dossier= array(); // on déclare le tableau contenant le nom des dossiers

	while($element = readdir($dir)) {
		if($element != '.' && $element != '..') {
			if (!is_dir($dir_nom.'/'.$element)) {$fichier[] = $element;}
			else {$dossier[] = $element;}
		}
	}

	closedir($dir);
	return array('dossier'=>$dossier,'fichier'=>$fichier);
}


$dir_nom = (isset($_GET['dir'])) ? $_GET['dir'] : './images'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.'  --> ('point')

// Récupérations des infos sur le dossier racine.
$infosDossier = lireDossier($dir_nom);
$dossier = $infosDossier['dossier'];
$fichier = $infosDossier['fichier'];

if(!empty($dossier)) {
    sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
    echo "Liste des dossiers accessibles dans '$dir_nom' : \n\n";
    echo "<br/><ul>";
        foreach($dossier as $lien){
			// Récupération des infos sur un sous dossier
			$infosSousDossier=lireDossier($dir_nom.'/'.$lien);
			// Pour choisir aléatoirement une de ses images
			shuffle($infosSousDossier['fichier']);
			// ATTENTION : Je n'ai pas traité le cas des sous dossiers vides
            echo '<br/><li><a href="affImgDir.php?dir='.$dir_nom.'/'.$lien.'"><img width="30px" height="30px" src="'.$dir_nom.'/'.$lien.'/'.$infosSousDossier['fichier'][0].'"/></a></li><br/>';
        }
    echo "</ul><br/>";
}

if(!empty($fichier)){
    sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
    echo "Liste des fichiers/documents accessibles dans '$dir_nom' : \n\n";
    echo "\t\t<ul>\n";
        foreach($fichier as $lien) {
            $size = GetImageSize("$dir_nom/$lien");
            
    //Largeur maximale de l'image pour la cr&eacute;ation des miniatures 
    $largeur_maxi = 100; 
    if ($size[0] > $largeur_maxi) 
        { 
            $width = $largeur_maxi; 
            $theight = ($size[0]/$largeur_maxi); 
            $height = ($size[1]/$theight); 
        } 
    else 
        { 
            //Sinon on garde la taille originale 
            $width = $size[0]; $height = $size[1]; 
        } 
            echo "\t\t\t<li><a href=\"$dir_nom/$lien \"><img src=\"$dir_nom/$lien \" width=".$width." height=".$height." alt=\"Photo des Vosges : $lien\" /></a></li>\n";
            
            echo  $size[0]. 'x' .$size[1] ;
        }
    echo "\t\t</ul>";
 }
Il faut nettoyer et optimiser ce code,
mais, en tout cas, ça prouve que ce que tu veux faire est possible.

Fred

Posté : 13 juin 2009, 23:14
par fabrice88250
Ok super sa fonctionne.

Je vais essayer maintenant de faire en sorte de pouvoir lier les répertoire a une base sql afin d'ajouter un commentaire sur le répertoire qui se trouvera donc être une galerie photos. (je n'ai encore aucunes idées comment faire).

Je vais aussi essayer que les images qui sont redimensionner pour le moment afin d'être petites soit réellement redimensionner pour être légère.

et après....

Posté : 15 juil. 2009, 19:17
par fabrice88250
bonjour me revoilà,

alors j'ai quelque peu avancé depuis la derniere fois et je peu maintenant enregistrer dans ma base de données les noms des repertoires et sous repertoires qui sont trouvés.

pour ça j'utilise ce petit bout de code :
//insertion des noms de répertoires dans la base de données : si un nom existe déjà on ajoute pas.

foreach($dossier as $d)	
{
// $d étant le nom du répertoire et pas un Array ;)
$sql = 'SELECT COUNT(id) as nb FROM IWgalerie WHERE repertoire = "'.$d.'"';
$sql = mysql_query($sql) or die(mysql_error());
$nb = mysql_fetch_object($sql);

if($nb->nb == 0) 
{
   $sql = "INSERT INTO IWgalerie (id, repertoire) VALUES('','$d')"; mysql_query($sql) or die('Erreur SQL !'.$sql.' '.mysql_error()); 
}
else 
{
    echo $d. 'existe déjà';
}
}
maintenant j'aimerai faire la meme chose mais au lieu d'enregistrer les noms de repertoire dans IWgalerie je voudrais enregistrer les photos qui sont dans les repertoires dans IWgaleriephotos.
C'est là que sa coince.

j'arrive bien a recuperer les images et enregistrer dans mysql uniquement si je suis dans le repertoire source. C'est a dire que si je vai dans un des sous repertoire les images ne s'enregistres plus dans ma base de données et je ne comprend pas pourquoi.

pour le code pour l'ajout des photos voilà se que j'ai fait :

//insertion des noms de photos dans la base de données : si un nom existe déjà on ajoute pas.

foreach($fichier as $f)	
{
// $d étant le nom du répertoire et pas un Array ;)
$sql = 'SELECT COUNT(id) as nbp FROM IWgaleriephoto WHERE photo = "'.$f.'"';
$sql = mysql_query($sql) or die(mysql_error());
$nbp = mysql_fetch_object($sql);

if($nbp->nbp == 0) 
{
   $sql = "INSERT INTO IWgaleriephoto (id, photo) VALUES('','$f')"; mysql_query($sql) or die('Erreur SQL !'.$sql.' '.mysql_error()); 
}
else 
{
    echo $f. 'existe déjà';
}
}
je recupere donc bien les images qui sont dans mon repertoire d'origine mais pas celle qui sont dans les sous repertoires.