[PHP-XML-Flash] listage repertoire [resolu]

listage repertoire [resolu] [PHP-XML-Flash] - PHP - Programmation

Marsh Posté le 20-08-2005 à 14:43:46    

j'ai fait (avec l'aide d'omega2 pour une sombre histoire de path) une interface flash pour parcourir les repertoires, et lire les medias qui y sont contenu (flv :video sous flash + mp3 et jpg).
Flash fait donc une requete a list_dir_php (avec xml="." ) a peu près de cette manière:

Code :
  1. //recup XML
  2. function OnLoad(success:Boolean) {
  3. if (success) {
  4.  debug_txt.text = this;
  5. }
  6. }
  7. //send XML
  8. function sendXML(path:String) {
  9. var send_xml:XML = new XML(path);
  10. send_xml.xmlDecl = "xml=";
  11. var Reply_xml:XML = new XML();
  12. Reply_xml.ignoreWhite = true;
  13. Reply_xml.onLoad = OnLoad;
  14. send_xml.sendAndLoad("list_dir.php", Reply_xml);
  15. }
  16. //pour avoir le listage du dossier ou se trouve le script PHP  
  17. sendXML("." );
  18. //pour avoir listage d'un sous dossier intitulé mes_docs
  19. sendXML("mes_docs/" );


Le script PHP lui renvoie un xml formaté avec les differents fichiers contenu dans le dossier.
voila a quoi ressemble list_dir.php:

Code :
  1. <?php
  2. //recuperation de $path (chemin d'acces au repertoire a lister)
  3. //_GET pour débugguer : list_dir.php?xml=monsousrepertoire/
  4. if (isset($_GET['xml'])) {
  5. $path = $_GET['xml'];
  6. }
  7. //_POST pour Flash
  8. if (isset($_POST['xml'])) {
  9. $path = $_POST['xml'];
  10. }
  11. if( !isset( $path ) || $path == "" )  {
  12. $path = ".";
  13. }
  14. //modification de path pour que is_dir() et filesize() trouve les fichiers  
  15. if( $path == "." )  {
  16. $phppath = "./";
  17. } else {
  18. $phppath = "./" . $path;
  19. }
  20. //ouverture et listage du repertoire
  21. $dir_handle=@opendir($path) or die("Unable to open dir" );
  22. while( false !== ( $file = readdir( $dir_handle ) ) ) {
  23. if (substr($file,0,1)!="." ) {
  24.  if (is_dir($phppath.$file)) {
  25.   $dirs[]=$file;
  26.  } else if(ereg("_T.JPG",strtoupper($file))){
  27.   $jpgs[]=substr($file,0,8);
  28.  } else if (ereg(".FLV",strtoupper($file))) {
  29.   $flvs[]=$file;
  30.  } else if (ereg(".MP3",strtoupper($file))) {
  31.   $mp3s[]=$file;
  32.  }
  33.    }
  34. }
  35. @closedir($dir_handle);
  36. //classe par type de fichier puis par ordre alphabetique et renvoie une liste formaté en XML
  37. echo '<?xml version="1.0" encoding="UTF-8"?><dossier path="'.$path.'">';
  38. if(isset($dirs) and is_array($dirs)) {
  39. natcasesort($dirs);
  40. foreach ($dirs as $dir){
  41.  echo '<fichier type="dir" taille="'.filesize( $phppath . $dir ).'" nom="'.$dir.'" />';
  42. }
  43. }
  44. if(isset($jpgs) and is_array($jpgs)) {
  45. natcasesort($jpgs);
  46. foreach ($jpgs as $jpg){
  47.  echo '<fichier type="jpg" taille="'.filesize( $phppath . $jpg . '.jpg' ).'" nom="'.$jpg.'.jpg" nomthumb="'.$jpg.'_T.jpg" />';
  48. }
  49. }
  50. if(isset($flvs) and is_array($flvs)) {
  51. natcasesort($flvs);
  52. foreach ($flvs as $flv){
  53.  echo '<fichier type="flv" taille="'.filesize( $phppath . $flv ).'" nom="'.$flv.'" />';
  54. }
  55. }
  56. if(isset($mp3s) and is_array($mp3s)) {
  57. natcasesort($mp3s);
  58. foreach ($mp3s as $mp3){
  59.  echo '<fichier type="mp3" taille="'.filesize( $phppath . $mp3 ).'" nom="'.$mp3.'" />';
  60. }
  61. }
  62. echo "</dossier>";
  63. ?>


J'éspére avoir débroussaillé un peu pour d'autres!
Il ne reste plus qu'a bosser un peu le Flash pour recuperer les infos de this, charger les video, les mp3 et afficher les photos...
merci encore à omega2 et shakpana


Message édité par mechkurt le 24-09-2005 à 16:24:52

---------------
D3
Reply

Marsh Posté le 20-08-2005 à 14:43:46   

Reply

Marsh Posté le 20-08-2005 à 15:26:07    

"is_dir ( string   filename  )"  
 
"$file = readdir( $dir_handle )" donnera le nom du fichier, pas son nom avec le chemin d'accés.  
 
Faudrait peut être donner le chemin complet pour qu'il le trouve le répertoire. Sinon, il cherchera dans le répertoire courant et s'il en trouve un, ca sera pas celui qu'est visé.  
 
 
Sinon, optimisation :  
while( false !== ( $file = readdir( $dir_handle ) ) )  
est la même chôse que :  
while ( $file = readdir( $dir_handle ) )  
vu que "pas faux" = "vrai".
 
En php, une affectation de valeur dans une variable retourne un booléen (vrai tant qu'il y a eu affectation possible) en plus de l'affectation en question. Donc il n'y a aucune raison de typer ça en comparant l'opération à un booléen.

Reply

Marsh Posté le 20-08-2005 à 15:34:27    

je suis pas sur d'avoir compris le debut de ta reponse...
le listage des sous repertoire fonctionne (essaye de cliquer sur le dossier 2002 par exemple)
http://mbillonlanfrey.free.fr/fecl [...] st_dir.swf
donc le path que je passe en argument est bien compris par le script PHP (il voie tous les fichiers qui sont dans le dossier 2002)
le PB c'est qu'il y a trois dossier dans 2002 (essai, truc et muche) et que ca il ne les voie pas
 
pour l'optimisation, c'était mon premier choix mais j'ai vue ici:
http://fr3.php.net/manual/en/function.readdir.php
This is the correct way to loop over the directory.
$
j'ai pas chérché a comprendre...
;-)
 
merci de ta réponse!


---------------
D3
Reply

Marsh Posté le 20-08-2005 à 15:43:00    

dans ton dossier 2002 t'as par exemple un dossier 05 et un dossier 06.
dans ton répertoire local ils y sont pas.
Si je me souvient bien, "$file = readdir( $dir_handle )" te retourneras donc "." puis ".." puis "05" puis "06".
Toi tu lui demandes si "05" est un dossier, mais si tu précises pas "2002/05" il cherchera "./05" qui n'existe pas.
 
Voilà ce qui merde dans ton script.
 
Quand aux fichiers qui sont bien repéré, c'est normal, tu compares leur nom à une chaine de caractére, vu que c'est une comparaison pour laquelle on se contrefiche de la position des fichiers sur le disque dur, c'est normal que la comparaison marche.


Message édité par omega2 le 20-08-2005 à 15:48:16
Reply

Marsh Posté le 20-08-2005 à 20:40:38    

je suis pas sur de comprendre (je suis un peu bourré juste la maintenant) mais je crois voir...
il faudraait que je change if (is_dir($file)) { et que je le transforme en if (is_dir($path.$file)) { ou un truc du genre...
j'essaye ca demain!
merci
;-)


---------------
D3
Reply

Marsh Posté le 20-08-2005 à 20:46:56    

dans le while ait un  
echo $file."<BR>";
 
Tu véras bien ce que ca contient. ;) j'utilises parfois cette méthode pour débugguer mes scripts. :))

Reply

Marsh Posté le 21-08-2005 à 16:07:44    

ayez ca marche comme je veux!
merci bcps!
j'ai édité mon poste pour que ca puisse servire a d'autres!
une derniere question si je veux debuguer mon code sans passer par Flash, est il possible de taper genre list_dir.php?xml="mes_docs/" dans mon browser pour voir le xml dans celui ci?
je suis pas sur d'avoir été tres clair ;-)


---------------
D3
Reply

Marsh Posté le 21-08-2005 à 16:13:32    

me semble que oui
en tout cas, je vois pas pourquioi ca marcherait pas. par contre, IE a eu droit à certaines versions qui n'affichait pas les pages xml mal formaté. Pour celles là, il fallait créer une page html avec un lien pour faire un enregistrer sous et le regarder dans un autre logiciel.

Reply

Marsh Posté le 21-08-2005 à 16:43:50    

ca m'a fait pensé que j'avais pas encore essayé avec IE...
pour une fois ca marche "mieux" que firefox, c.a.d qu'il affiche direct le xml alors que firefox necessite d'afficher la source
 
sinon ben ca marche pô list_dir.php?xml="mes_docs/"
-> que je le tape comme ca il me transforme les " en %22
-> ou que je le tape sans les guillemets list_dir.php?xml=mes_docs/
 
=>dans les deux cas il me renvoie le listage de la racine ("." )
 
je pense que c'est a cause de ca:

Code :
  1. $path = $_POST['xml'];
  2. if( !isset( $path ) || $path == "" )  {
  3.      $path = ".";
  4. }


mais ca veut quand même dire que ca passe pas bien...
c'est pas bien grave je me debrouillerais pour debuguer comme je peut avec Flash


---------------
D3
Reply

Marsh Posté le 28-08-2005 à 20:27:10    

encore une question...
cette portion de code:

Code :
  1. if ($dirs){
  2.    gnagnagna
  3. }
  4. if ($jpgs){
  5.    gnagnagna
  6. }
  7. if ($flvs){
  8.    gnagnagna
  9. }
  10. if ($mp3s){
  11.    gnagnagna
  12. }


me cause des erreurs sous easyPHP (je sais c'est pas terrible d'utiliser ca mais c'est pratique pour montrer mon truc a des gens qu'on pas l'internet)
j'ai resolu le PB en faisant ca:

Code :
  1. $direxist=false;
  2. $jpgexist=false;
  3. $mp3exist=false;
  4. $flvexist=false;
  5. //etc...
  6. while( false !== ( $file = readdir( $dir_handle ) ) ) {
  7.     if (substr($file,0,1)!="." ) {
  8.         if (is_dir($phppath.$file)) {
  9.             $dirs[]=$file;
  10.             $direxist=true;
  11.         } else if(ereg("_T.JPG",strtoupper($file))){
  12.             $jpgs[]=substr($file,0,8); 
  13.             $jpgexist=true;
  14.         } else if (ereg(".FLV",strtoupper($file))) {
  15.             $flvs[]=$file;
  16.             $flvexist=true;
  17.         } else if (ereg(".MP3",strtoupper($file))) {
  18.             $mp3s[]=$file; 
  19.             $mp3exist=true;
  20.         } 
  21.    }
  22. }
  23. //etc...
  24. if ($direxist){
  25.    gnagnagna
  26. }
  27. if ($jpgexist){
  28.    gnagnagna
  29. }
  30. if ($flvexist){
  31.    gnagnagna
  32. }
  33. if ($mp3exist){
  34.    gnagnagna
  35. }


ca me semble moins propre mais comme ca resout le PB...
est ce que EasyPHP a raison et le fait de tester l'existence d'un array non déclaré de cette maniére est source d'erreur ?
a part ca si qq'un sait pourquoi list_dir.php?xml="mes_docs/" ne marche pas je suis preneur!
merci ;-)


---------------
D3
Reply

Marsh Posté le 28-08-2005 à 20:27:10   

Reply

Marsh Posté le 01-09-2005 à 16:43:36    

:bounce:


---------------
D3
Reply

Marsh Posté le 24-09-2005 à 10:57:37    

j'ai toujours ce PB de undefined index sous easy PHP, je ne vais quand même pas faire ce pricncipe de booleen sessionexist, panoramiqueexist, etc... pour toutes les variables que j'utilise dans un code...
 
je sais que easyPHP c'est pas top mais j'ai pas trops le choix quand il s'agit d'aller montrer un site PHP chez un client qui n'as pas Internet...
 
Il doit bien exister une autre methode...
 
Help!


---------------
D3
Reply

Marsh Posté le 24-09-2005 à 13:48:43    

Hello, je m'immisce dans la conversation ...
 
- concernant tes $trucexist, j'aurait tendance à te proposer un

Code :
  1. if(isset($truc))


ou encore

Code :
  1. if(isset($truc) and is_array($truc))


tu gagnes 8 lignes et 4 variables, et passe gentillement un "error_reporting(E_ALL);" ...
et surtout, tu ne réinventes pas la roue ;p
 
- concernant %22, list_dir.php?xml="mes_docs/"
je comprend pas pourquoi l'idée t'es venu de mettre des guillemets ... ?
parce qu'en ce cas un "echo $_GET['xml'];" vas te donner "[guillemet]mes_docs/[guillemet]", ce qui ne risque pas de ressembler à un nom de dossier valide ...
 
a+
shakpana

Reply

Marsh Posté le 24-09-2005 à 15:21:19    

ouais effectivement isset ressemble bien a ce que je cherche mais est ce que easyPHP m'eduque de force a faire des verifs de ce genre (alors que chez free mon script fonctionne tres bien sans ces verifications) ?
les guillemets c'est sans doute parcque inconsciemment je pensais a un string ;-)


---------------
D3
Reply

Marsh Posté le 24-09-2005 à 16:05:11    

> easyPHP m'eduque de force (...)
tu veux dire des erreurs "Notice" ?
J'utilise eror_reporting(E_ALL) en developpement, ça sert - finalement - même si des fois on l'a impression de faire plus de test d'existence de valeurs qu'autre chose, mais au final ton code est qd même plus "sûr" ... et ça permet de pas tomber dans du debuggage sauvage à la recherche d'une variable non-existente ...

Reply

Marsh Posté le 24-09-2005 à 16:17:34    

Ok si tester une variable (avec isset()) avant de l'utiliser et une bonne habitude a prendre alors je vais la prendre ;-)


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

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