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

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

Marsh Posté le 14-06-2013 à 15:47:33    

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
Reply

Marsh Posté le 14-06-2013 à 15:47:33   

Reply

Marsh Posté le 14-06-2013 à 16:12:16    

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
Reply

Marsh Posté le 14-06-2013 à 16:54:04    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed