Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3047 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [Résolu] Problème d'affichage de répertoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Problème d'affichage de répertoire

n°2194374
mini56
Posté le 14-06-2013 à 15:47:33  profilanswer
 

Bonjour,
Alors j'ai un petit problème sur un bout de code php, je vous explique.
J'ai un index.php sur mon serveur debié linux (LAMP). Sur ce serveur je veux pouvoir lister le contenu de certain dossier. Pour cela je rajoute un index.php et il me liste proprement, avec la taille des fichiers, et aussi un tri alphabétique en séparant dossier et fichier, et surtout il me met un icône dossier ou fichier devant les dossiers ou fichiers. Mais (voila mon problème) lorsqu'un dossier contient un point alors il me met un icône fichier  :sweat:  
trêve de blabla j’envoie le code (il est pas complet) :

Code :
  1. <?php
  2. echo'<br><font color="FF0000">';
  3. ?>
  4. </td></tr>
  5. <?php
  6. function listing($repertoire){
  7. $fichier = array();
  8. if (is_dir($repertoire)){
  9. $dir = opendir($repertoire); //ouvre le repertoire courant désigné par la variable
  10. while(false!==($file = readdir($dir))){ //on lit tout et on récupere tout les fichiers dans $file
  11. if(!in_array($file, array('.','..'))){ //on eleve le parent et le courant '. et ..'
  12. $page = $file; //sort l'extension du fichier
  13. $page = explode('.', $page);
  14. $nb = count($page);
  15. $nom_fichier = $page[0];
  16. for ($i = 1; $i < $nb-1; $i++){
  17. $nom_fichier .= '.'.$page[$i];
  18. }
  19. if(isset($page[1])){
  20. $ext_fichier = $page[$nb-1];
  21. }
  22. else {
  23. if(!is_file($file)) { $file = '/'.$file; } //on rajoute un "/" devant les dossier pour qu'ils soient triés au début
  24. $ext_fichier = '';
  25. }
  26. if($ext_fichier != 'php' and $ext_fichier != 'html' and $ext_fichier != 'swp' and $ext_fichier != 'htpasswd' and $ext_fichier != 'htaccess' ) { //utile pour exclure certains types de fichiers à ne pas lister
  27. array_push($fichier, $file);
  28. }
  29. }
  30. }
  31. }
  32. natcasesort($fichier); //la fonction natcasesort( ) est la fonction de tri standard sauf qu'elle ignore la casse
  33. $IMG_EXT= array(".jpg",".png" );
  34. foreach($fichier as $value) {
  35. if (in_array(substr($value,-4), $IMG_EXT)){
  36.  $size=round(filesize($value) / 1024/1024, 5);
  37.                 echo "<tr><td><a href=$value><img src=$value width='10%' height='10%'></a></td><td> $size mo </td></tr>";
  38.         }else {
  39. if(preg_match("*/*",$value)) { // c'est un dossier
  40.  echo "<tr><td><img src=monimagedossier.png> ";
  41.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  42.  echo "<td></td></tr>";}
  43. else { //c'est un fichier
  44.  $ssize=round(filesize($value) / 1024/1024, 5);
  45.  echo "<tr><td><img src=monimagefichier.png> ";
  46.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  47.  echo "<td>&nbsp $ssize mo</td></tr>";
  48. }
  49. }
  50. }
  51. }
  52. //exemple d'utilisation :
  53. listing('.'); //chemin du dossier
  54. ?>


 
Alors j'arrive à afficher les dossiers comme il faut mais je n'est plus les dossiers en premier en utilisant ce code :

Code :
  1. <?php
  2. echo'<br><font color="FF0000">';
  3. ?>
  4. </td></tr>
  5. <?php
  6. function listing($repertoire){
  7. $fichier = array();
  8. if (is_dir($repertoire)){
  9. $dir = opendir($repertoire); //ouvre le repertoire courant désigné par la variable
  10. while(false!==($file = readdir($dir))){ //on lit tout et on récupere tout les fichiers dans $file
  11. if(!in_array($file, array('.','..'))){ //on eleve le parent et le courant '. et ..'
  12. $page = $file; //sort l'extension du fichier
  13. $page = explode('.', $page);
  14. $nb = count($page);
  15. $nom_fichier = $page[0];
  16. for ($i = 1; $i < $nb-1; $i++){
  17. $nom_fichier .= '.'.$page[$i];
  18. }
  19. if(isset($page[1])){
  20. $ext_fichier = $page[$nb-1];
  21. }
  22. else {
  23. //if(strstr(filetype($file), 'dir')) { $file = '/'.$file; } //on rajoute un "/" devant les dossier pour qu'ils soient triés au début
  24. }
  25. $ext_fichier = '';
  26. if($ext_fichier != 'php' and $ext_fichier != 'html' and $ext_fichier != 'swp' and $ext_fichier != 'htpasswd' and $ext_fichier != 'htaccess' ) { //utile pour exclure certains types de fichiers à ne pas lister
  27. array_push($fichier, $file);
  28. }
  29. }
  30. }
  31. }
  32. natcasesort($fichier); //la fonction natcasesort( ) est la fonction de tri standard sauf qu'elle ignore la casse
  33. $IMG_EXT= array(".jpg",".png" );
  34. foreach($fichier as $value) {
  35. if (in_array(substr($value,-4), $IMG_EXT)){
  36.  $size=round(filesize($value) / 1024/1024, 5);
  37.                 echo "<tr><td><a href=$value><img src=$value width='10%' height='10%'></a></td><td> $size mo </td></tr>";
  38.         }else {
  39. if(strstr(filetype($value), 'dir')) { // c'est un dossier
  40.  echo "<tr><td><img src=monimagedossier.png> ";
  41.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  42.  echo "<td></td></tr>";}
  43. else { //c'est un fichier
  44.  $ssize=round(filesize($value) / 1024/1024, 5);
  45.  echo filetype($file);
  46.  echo "<tr><td><img src=monimagefichier.png> ";
  47.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  48.  echo "<td>&nbsp $ssize mo</td></tr>";
  49. }
  50. }
  51. }
  52. }
  53. //exemple d'utilisation :
  54. listing('.'); //chemin du dossier
  55. ?>


 
Merci d'avance pour votre aide, car la j'en perd mes cheveux ^^


Message édité par mini56 le 20-06-2013 à 00:48:15
mood
Publicité
Posté le 14-06-2013 à 15:47:33  profilanswer
 

n°2194389
dreameddea​th
Posté le 14-06-2013 à 16:12:16  profilanswer
 

Bonjour,
 
Quelques remarques générales :
- la gestion du découpage des extensions/nom du fichier/répertoire n'a pas besoin d'être recodé : il existe la fonction pathinfo pour ça
- gérer un tri dossier en premier via l'ajout d'un / n'est pas très propre
 
Et comme tu vires le / dans le deuxième exemple, le tri ne se fait plus et le preg_match a une expression regulière pour moi fausse car * est un caractère spécial (j'aurais plutôt vu qq chose du style '@^/@')
 
2 solutions pour moi :
- faire 2 tableaux à trier séparément et les fusionner en utilisant array_merge
- faire 1 tableau complexe avec chaque element est un tableau de type array({nom},{type});
 
Exemple

Code :
  1. $fichiers=array();
  2. for(....){
  3.    ....
  4.    $type_file = is_dir($file)?0:1;
  5.    $ext_fichier = pathinfo($file, PATHINFO_EXTENSION) ;
  6.    if(!in_array($ext_fichier,array('php','html','swp','htpasswd','htaccess' )) {///utilisation de in_array
  7.         array_push($fichiers, array($file,$type_file));
  8.    }
  9.    ...
  10. }
  11. ///Utilisation de usort pour trier suivant le 2ème element de tableau
  12. usort($fichiers,function($a,$b){
  13.      return ($a[1]>$b[1])?1:(($a[1]<$b[1])?-1:0);
  14. });
  15. foreach($fichiers as $fichier){
  16.    /// $fichier[0] === value et $fichier[1]===[type fichier]
  17. }

Message cité 1 fois
Message édité par dreameddeath le 14-06-2013 à 16:16:48
n°2194396
mini56
Posté le 14-06-2013 à 16:54:04  profilanswer
 

dreameddeath a écrit :

Bonjour,

 

Quelques remarques générales :
- la gestion du découpage des extensions/nom du fichier/répertoire n'a pas besoin d'être recodé : il existe la fonction pathinfo pour ça
- gérer un tri dossier en premier via l'ajout d'un / n'est pas très propre

 

Et comme tu vires le / dans le deuxième exemple, le tri ne se fait plus et le preg_match a une expression regulière pour moi fausse car * est un caractère spécial (j'aurais plutôt vu qq chose du style '@^/@')

 

2 solutions pour moi :
- faire 2 tableaux à trier séparément et les fusionner en utilisant array_merge
- faire 1 tableau complexe avec chaque element est un tableau de type array({nom},{type});

 

Exemple

Code :
  1. $fichiers=array();
  2. for(....){
  3.    ....
  4.    $type_file = is_dir($file)?0:1;
  5.    $ext_fichier = pathinfo($file, PATHINFO_EXTENSION) ;
  6.    if(!in_array($ext_fichier,array('php','html','swp','htpasswd','htaccess' )) {///utilisation de in_array
  7.         array_push($fichiers, array($file,$type_file));
  8.    }
  9.    ...
  10. }
  11. ///Utilisation de usort pour trier suivant le 2ème element de tableau
  12. usort($fichiers,function($a,$b){
  13.      return ($a[1]>$b[1])?1:(($a[1]<$b[1])?-1:0);
  14. });
  15. foreach($fichiers as $fichier){
  16.    /// $fichier[0] === value et $fichier[1]===[type fichier]
  17. }


 

Merci pour ta réponse.
Alors après ce que tu m'a dis j'ai cherché à faire deux tableaux (je galère étant débutant), et en regardant le code de plus près et en le simplifiant, j'ai réussi à solutionner mon bug en supprimant un test, que je ne comprenait pas ^^. Je précise aussi que le code est une modification d'un code trouvé via google.
Le nouveau code :

Code :
  1. function listing($repertoire){
  2. $fichier = array();
  3. $dir = opendir($repertoire); //ouvre le repertoire courant désigné par la variable
  4. while(false!==($file = readdir($dir))){ //on lit tout et on récupere tout les fichiers dans $file
  5. if(!in_array($file, array('.','..'))){ //on eleve le parent et le courant '. et ..'
  6. $page = $file; //sort l'extension du fichier
  7. $page = explode('.', $page);
  8. $nb = count($page);
  9. $nom_fichier = $page[0];
  10. for ($i = 1; $i < $nb-1; $i++){
  11. $nom_fichier .= '.'.$page[$i];
  12. }
  13. if(strstr(filetype($file), 'dir')) { $file = '/'.$file; } //on rajoute un "/" devant les dossier pour qu'ils soient triés au début
  14. $path_parts = pathinfo($file);
  15. if($path_parts['extension'] != 'php' and $path_parts['extension'] != 'html' and $path_parts['extension'] != 'swp' and $path_parts['extension'] != 'htpasswd' and $path_parts['extension'] != 'htaccess' and $path_parts['extension'] != 'cache' ) { //utile pour exclure certains types de fichiers à ne pas lister
  16. array_push($fichier, $file);
  17. }
  18. }
  19. }
  20. natcasesort($fichier); //la fonction natcasesort( ) est la fonction de tri standard sauf qu'elle ignore la casse
  21. $IMG_EXT= array(".jpg",".png" );
  22. foreach($fichier as $value) {
  23. if (in_array(substr($value,-4), $IMG_EXT)){
  24.  $size=round(filesize($value) / 1024/1024, 5);
  25.                 echo "<tr><td><a href=$value><img src=$value width='10%' height='10%'></a></td><td> $size mo </td></tr>";
  26.         }else {
  27. if(preg_match("*/*",$value)) { // c'est un dossier
  28.  echo "<tr><td><img src=monimagedossier.png> ";
  29.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  30.  echo "<td></td></tr>";}
  31. else { //c'est un fichier
  32.  $ssize=round(filesize($value) / 1024/1024, 5);
  33.  echo filetype($file);
  34.  echo "<tr><td><img src=monimagefichier.png> ";
  35.  echo '<a href="'.rawurlencode($repertoire).'/'.rawurlencode(str_replace ('/', '', $value)).'">'.$value.'</a></td>';
  36.  echo "<td>&nbsp $ssize mo</td></tr>";
  37. }
  38. }
  39. }
  40. }
 

edit : Petit modif du code sur les extensions


Message édité par mini56 le 14-06-2013 à 17:20:42

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [Résolu] Problème d'affichage de répertoire

 

Sujets relatifs
[VBA] Enregistrement feuille excel dans un répertoireProblème "undefined reference to setPixelV@16"
[Résolu] Problème affichage tableauProbleme Avec mon site web
Problème d'exécution fonction shell, lien entre vba et C++[VBA Excel 2003] - Problème pour récupérer la 65537° ligne d'un CVS
Problème de mise en ligne d un site local[VBA] Ouverture et copie informations à partir d'un répertoire
Problème portée de variable 
Plus de sujets relatifs à : [Résolu] Problème d'affichage de répertoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR