Gestionnaire de fichiers/MySQL

Voir les commentaires (0)
Avatar
Auteur : Naymenton
Créé le : 09/05/2009
Vus : 897 fois
Dernière modification le : 10/08/2009
License : Creative Commons License

Dans ce tutoriel, nous verrons comment :

- Lister le contenu d'un répertoire
- Créér des dossiers/fichiers
- Supprimer/Modifier/Télécharger un fichier/dossier
- Lister les bases de données d'un serveur
- Lister les tables d'une base de donnée
- Récupérer la structure d'une table
- Etc

Ce script sera découpé en fonctions.



La gestion de fichiers


L'explorer de fichiers



Nous allons créér une fonction prenant en paramètre, le dossier a explorer, et la récursivité.

Elle parcourra un dossier, listant dans un array la liste de ses fichiers, pour cela ont vas utiliser une boucle et la fonction readdir([ resource $dir_handle ])
Code PHP :
  1. function explorer($dir, $recursif=false)
  2. {
  3. $listeFichier = array();
  4. $pointeur = opendir($dir);
  5. while ($fichier = readdir($pointeur)){
  6. // On ne tiens pas conte du dossier courant
  7. if(!in_array($fichier, array('.','..'))){
  8. // Est ce que le fichier est un repertoire ?
  9. // On n'oublie pas rajouter le chemin du fichier
  10. if (is_dir($dir."/".$fichier) && $recursif){
  11.  
  12. // Recursif = oui ? alors explorons le !
  13. $listeFichier = array_merge($listeFichier, explorer($dir.'/'.$fichier, $recursif));
  14. }
  15. else {
  16. // C'est un fichier, on l ajoute
  17. $listeFichier[] = "$dir/$fichier";
  18. }
  19.  
  20.  
  21. }
  22. }
  23. // L'exploration est termnier, on ferme =p
  24. closedir($pointeur);
  25. // On retourne la liste des fichier
  26. return $listeFichier;
  27. }


Rien de très compliqué, on vérifie grâce à la fonction is_dir( string $filename ) si le fichier passé en paramètre est un répertoire, si oui et que la récursivité est activé, on l'explore en fusionnant les résultats dans notre array grâce à la fonction array_merge( array $array1 [, array $array2 [, array $... ]] )

Vous pouvez faire un print_r sur le résultat renvoyé, vous verrez apparaitre un tableau contenant la liste des fichiers du dossier :



Affichage des fichiers listés



On vas maintenant passer à une fonction affichant dans un tableau(html) les fichiers du répertoire courant.
On récupère la liste des fichiers grâce à la fonction explorer(), on parcours notre array, on vérifie si le fichier est un dossier, on l'affiche en tant que dossier, sinon bah ... en tant que fichier :p

Je vous laisse observer la fonction, avant de donner quelques autres explications.


Code PHP :
  1.  
  2. <?php
  3. function listRepertoire()
  4. {
  5. // Récupération du chemin courant
  6. $repCourant = getcwd();
  7.  
  8. $fichiers = explorer(".");
  9. // ajout ".." (qui a été filtré par la fonction)
  10. if ($repCourant != "/") $fichiers = array_merge(array("./.."), $fichiers);
  11. ?>
  12. <form action="<?php echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>" method="post">
  13. <table border="1" width="100%">
  14. <tr>
  15. <td><font color="#cc0000">
  16. <?php echo $repCourant; ?>
  17. </td></font>
  18. <td><font color="#cc0000"><?php echo round(disk_total_space("./")/pow(2,20), 1) . " / ". round(disk_free_space("./")/pow(2,20), 1). " Mo"; ?>
  19. </td></font>
  20. </tr>
  21. </table>
  22. <table border="0" width="100%">
  23. <tr>
  24. <th>Action</th>
  25. <th>Nom du fichier</th>
  26. <th>Taille</th>
  27. <th>Permissions</th>
  28. </tr>
  29. <?php
  30. for ($i=0; $i<count($fichiers); $i++)
  31. {
  32. ?>
  33. <tr>
  34. <td>
  35. <?php
  36. /* Le fichier est-il un répertoire ? */
  37. if (is_dir($fichiers[$i]))
  38. {
  39.  
  40. ?> <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=supprimer';?>" /> [x] </a>
  41. <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=modifier#modif'; ?>" />[ Modifier] </a>
  42. <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=telecharger'; ?>" />[ Télécharger] </a>
  43. </td>
  44. <td class="center">
  45. <a href="?repertoire=<?php echo $repCourant."/".$fichiers[$i];?>">
  46. <?php echo "<span style='color:red;'>[ " .basename($fichiers[$i])." ]";?>
  47. </a>
  48. </td>
  49. <td class="center">
  50. [Dossier]
  51.  
  52. </td>
  53.  
  54. <?php
  55. }else{
  56.  
  57. ?>
  58. <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=supprimer';?>" /> [x] </a>
  59. <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=modifier#modif'; ?>" />[ Modifier] </a>
  60. <a href="<?php echo '?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=telecharger'; ?>" />[ Télécharger] </a>
  61. </td>
  62. <td class="center">
  63. <?php
  64.  
  65. echo '<a href="?repertoire='.$repCourant."&f=".$fichiers[$i].'&action=modifier#modif">'.basename($fichiers[$i]).'</a>';
  66.  
  67. ?>
  68. </td>
  69. <td class="center">
  70. <?php echo tailleFichier($fichiers[$i]); ?>
  71. </td>
  72. <?php
  73. }
  74. ?>
  75. <td class="center">
  76. <?php echo afficherPerm($fichiers[$i]); // pour plus tard ?>
  77. </td>
  78. </tr>
  79. <?php
  80. }
  81. ?>
  82. </table>
  83. <?php
  84. }


Comme vous pouvez le voir le voir, on récupère le répertoire courant grâce à getcwd(), ce qui nous permet ensuite de le passer en paramètre via la variable $_GET['repertoire'] qui nous permettra par la suite d'appliquer divers traitements aux fichiers, que l'ont passent aussi en paramètres via $_GET['f'] :

- Supprimer : &f=".$fichiers[$i].'&action=supprimer'
- Modifier : &f=".$fichiers[$i].'&action=modifier#modif'
- Télécharger : &f=".$fichiers[$i].'&action=telecharger'

Dans ce tableau est affiché différentes options telle que la taille et les droits du fichier, grâces au fonctions tailleFichier() et afficherPerm(), que nous allons créer d'ici peu.
J'ai aussi rajouter un "prés tableau" affichant le répertoire courant ainsi que l'espace totale du disque courant disponible et de l'espace utiliser grâce au fonction disk_total_space() et disk_free_space().

Pour appeler le fonction, on vérifie tous d'abord, si un répertoire et passé en paramètre dans l'url, si oui, on demandera a php de changer le répertoire courant à l'aide de chdir(), ce qui nous permet de pouvoir explorer des dossiers, le répertoire courant étant récupéré lors de l'utilisation de notre fonction listRepertoire().


Code PHP :
  1. if ($_GET["repertoire"])
  2. {
  3. if (!@chdir($_GET["repertoire"]))
  4. {
  5. $erreur = "Le changement de répertoire a échoué.";
  6. }
  7. }
  8. listRepertoire();


La Taille d'un fichier


La taille d'un fichier ce récupére grâce àfileSize() qui renvoie la taille d'un fichier en octets, on vas donc créer une petite fonction permettant la conversion de la taille en octet/ko/mo.

Bon la, pas de secret, rien ne vaut un peut de mathématique, on vas tous simplement utiliser la fonction pow

Code PHP :
  1.  
  2. function tailleFichier($fichier)
  3. {
  4. // Covertion octet / ko / mo
  5. $ko = pow(2,10);
  6. $mo = pow(2,20);
  7.  
  8. // On recupere la taille en octet
  9. $taille = fileSize($fichier);
  10.  
  11. if ($taille < $ko){
  12. // On laisse en octet
  13. $taille = $taille . " octets";
  14. }
  15. elseif ($taille >= $ko AND $taille < $mo)
  16. // Sinon ko, puis mo
  17. {
  18. $taille = round($taille/$ko, 1) . " ko";
  19. }
  20. else
  21. {
  22. $taille = round($taille/$mo, 1) . " Mo";
  23. }
  24. return $taille;
  25.  
  26. }

Afficher les permissions



Encore moins compliqué, il n'y a même pas grand chose a dire, php a une fonction toute faite fileperms(), on vas juste ce contenter d'en personnaliser l'affiche pour le passer en "mode unix"


Code PHP :
  1.  
  2. function afficherPerm($fichier)
  3. {
  4. $perms = fileperms($fichier);
  5.  
  6. if (($perms & 0xC000) == 0xC000) {
  7. // Socket
  8. $info = 's';
  9. } elseif (($perms & 0xA000) == 0xA000) {
  10. // Lien symbolique
  11. $info = 'l';
  12. } elseif (($perms & 0x8000) == 0x8000) {
  13. // Régulier
  14. $info = '-';
  15. } elseif (($perms & 0x6000) == 0x6000) {
  16. // Block spécial
  17. $info = 'b';
  18. } elseif (($perms & 0x4000) == 0x4000) {
  19. // Dossier
  20. $info = 'd';
  21. } elseif (($perms & 0x2000) == 0x2000) {
  22. // Caractère spécial
  23. $info = 'c';
  24. } elseif (($perms & 0x1000) == 0x1000) {
  25. // FIFO pipe
  26. $info = 'p';
  27. } else {
  28. // Inconnu
  29. $info = 'u';
  30. }
  31.  
  32. // Propriétaire
  33. $info .= (($perms & 0x0100) ? 'r' : '-');
  34. $info .= (($perms & 0x0080) ? 'w' : '-');
  35. $info .= (($perms & 0x0040) ?
  36. (($perms & 0x0800) ? 's' : 'x' ) :
  37. (($perms & 0x0800) ? 'S' : '-'));
  38.  
  39. // Groupe
  40. $info .= (($perms & 0x0020) ? 'r' : '-');
  41. $info .= (($perms & 0x0010) ? 'w' : '-');
  42. $info .= (($perms & 0x0008) ?
  43. (($perms & 0x0400) ? 's' : 'x' ) :
  44. (($perms & 0x0400) ? 'S' : '-'));
  45.  
  46. // Tous
  47. $info .= (($perms & 0x0004) ? 'r' : '-');
  48. $info .= (($perms & 0x0002) ? 'w' : '-');
  49. $info .= (($perms & 0x0001) ?
  50. (($perms & 0x0200) ? 't' : 'x' ) :
  51. (($perms & 0x0200) ? 'T' : '-'));
  52. return $info;
  53. }
  54.  


Téléchargement d'un fichier



Pour forcer le téléchargement d'un fichier, tous ce passe dans les entêtes, pourquoi comment, je n'en sait rien, ce doit être un dogme, j'ai personnellement repris une fonction trouvé sur le net.

Code PHP :
  1.  
  2. function telecharger($nom, $chemin, $taille)
  3. {
  4. header('Content-Type: application/octet-stream');
  5. header('Content-Length: '. $taille);
  6. header('Content-disposition: attachment; filename='. $nom);
  7. header('Pragma: no-cache');
  8. header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
  9. header('Expires: 0');
  10. readfile($chemin);
  11. }
  12.  


Compression d'un fichier



Pour télécharger un répertoire, il nous sera nécessaire avant toute chose d'en compresser le contenu.
On vas donc créer une fonction, prenant en paramètre un array contenant tous les fichiers à compresser ainsi que le nom du répertoire a compresser.
Nous allons utilisé la fonction, on vas donc d'abord importé la class zipfile de la bibliotheque zlib :


Code PHP :
  1.  
  2. // Class zip prefete, tranquille (fou)
  3. class zipfile
  4. {
  5. /**
  6.   * Array to store compressed data
  7.   *
  8.   * @var array $datasec
  9.   */
  10. var $datasec = array();
  11.  
  12. /**
  13.   * Central directory
  14.   *
  15.   * @var array $ctrl_dir
  16.   */
  17. var $ctrl_dir = array();
  18.  
  19. /**
  20.   * End of central directory record
  21.   *
  22.   * @var string $eof_ctrl_dir
  23.   */
  24. var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  25.  
  26. /**
  27.   * Last offset position
  28.   *
  29.   * @var integer $old_offset
  30.   */
  31. var $old_offset = 0;
  32.  
  33.  
  34. /**
  35.   * Converts an Unix timestamp to a four byte DOS date and time format (date
  36.   * in high two bytes, time in low two bytes allowing magnitude comparison).
  37.   *
  38.   * @param integer the current Unix timestamp
  39.   *
  40.   * @return integer the current date in a four byte DOS format
  41.   *
  42.   * @access private
  43.   */
  44. function unix2DosTime($unixtime = 0) {
  45. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  46.  
  47. if ($timearray['year'] < 1980) {
  48. $timearray['year'] = 1980;
  49. $timearray['mon'] = 1;
  50. $timearray['mday'] = 1;
  51. $timearray['hours'] = 0;
  52. $timearray['minutes'] = 0;
  53. $timearray['seconds'] = 0;
  54. } // end if
  55.  
  56. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  57. ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  58. } // end of the 'unix2DosTime()' method
  59.  
  60.  
  61. /**
  62.   * Adds "file" to archive
  63.   *
  64.   * @param string file contents
  65.   * @param string name of the file in the archive (may contains the path)
  66.   * @param integer the current timestamp
  67.   *
  68.   * @access public
  69.   */
  70. function addFile($data, $name, $time = 0)
  71. {
  72. $name = str_replace('\\', '/', $name);
  73.  
  74. $dtime = dechex($this->unix2DosTime($time));
  75. $hexdtime = '\x' . $dtime[6] . $dtime[7]
  76. . '\x' . $dtime[4] . $dtime[5]
  77. . '\x' . $dtime[2] . $dtime[3]
  78. . '\x' . $dtime[0] . $dtime[1];
  79. eval('$hexdtime = "' . $hexdtime . '";');
  80.  
  81. $fr = "\x50\x4b\x03\x04";
  82. $fr .= "\x14\x00"; // ver needed to extract
  83. $fr .= "\x00\x00"; // gen purpose bit flag
  84. $fr .= "\x08\x00"; // compression method
  85. $fr .= $hexdtime; // last mod time and date
  86.  
  87. // "local file header" segment
  88. $unc_len = strlen($data);
  89. $crc = crc32($data);
  90. $zdata = gzcompress($data);
  91. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
  92. $c_len = strlen($zdata);
  93. $fr .= pack('V', $crc); // crc32
  94. $fr .= pack('V', $c_len); // compressed filesize
  95. $fr .= pack('V', $unc_len); // uncompressed filesize
  96. $fr .= pack('v', strlen($name)); // length of filename
  97. $fr .= pack('v', 0); // extra field length
  98. $fr .= $name;
  99.  
  100. // "file data" segment
  101. $fr .= $zdata;
  102.  
  103. // "data descriptor" segment (optional but necessary if archive is not
  104. // served as file)
  105. // nijel(2004-10-19): this seems not to be needed at all and causes
  106. // problems in some cases (bug #1037737)
  107. //$fr .= pack('V', $crc); // crc32
  108. //$fr .= pack('V', $c_len); // compressed filesize
  109. //$fr .= pack('V', $unc_len); // uncompressed filesize
  110.  
  111. // add this entry to array
  112. $this -> datasec[] = $fr;
  113.  
  114. // now add to central directory record
  115. $cdrec = "\x50\x4b\x01\x02";
  116. $cdrec .= "\x00\x00"; // version made by
  117. $cdrec .= "\x14\x00"; // version needed to extract
  118. $cdrec .= "\x00\x00"; // gen purpose bit flag
  119. $cdrec .= "\x08\x00"; // compression method
  120. $cdrec .= $hexdtime; // last mod time & date
  121. $cdrec .= pack('V', $crc); // crc32
  122. $cdrec .= pack('V', $c_len); // compressed filesize
  123. $cdrec .= pack('V', $unc_len); // uncompressed filesize
  124. $cdrec .= pack('v', strlen($name) ); // length of filename
  125. $cdrec .= pack('v', 0 ); // extra field length
  126. $cdrec .= pack('v', 0 ); // file comment length
  127. $cdrec .= pack('v', 0 ); // disk number start
  128. $cdrec .= pack('v', 0 ); // internal file attributes
  129. $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set
  130.  
  131. $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
  132. $this -> old_offset += strlen($fr);
  133.  
  134. $cdrec .= $name;
  135.  
  136. // optional extra field, file comment goes here
  137. // save to central directory
  138. $this -> ctrl_dir[] = $cdrec;
  139. } // end of the 'addFile()' method
  140.  
  141.  
  142. /**
  143.   * Dumps out file
  144.   *
  145.   * @return string the zipped file
  146.   *
  147.   * @access public
  148.   */
  149. function file()
  150. {
  151. $data = implode('', $this -> datasec);
  152. $ctrldir = implode('', $this -> ctrl_dir);
  153.  
  154. return
  155. $data .
  156. $ctrldir .
  157. $this -> eof_ctrl_dir .
  158. pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
  159. pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
  160. pack('V', strlen($ctrldir)) . // size of central dir
  161. pack('V', strlen($data)) . // offset to start of central dir
  162. "\x00\x00"; // .zip file comment length
  163. } // end of the 'file()' method
  164.  
  165. } // end of the 'zipfile' class
  166.  


Pour pouvoir ensuite l'utiliser dans notre fonction, qui compressera dans un zip, tous le contenu de notre array avant de proposer son téléchargement.


Code PHP :
  1.  
  2. function zop($array, $repertoire)
  3. {
  4. $zip = new zipfile();
  5. for ($i=0; $i<count($array); $i++)
  6. {
  7. $nom = basename($array[$i]);
  8. $fp = fopen($array[$i], "r");
  9. $data[$i] = fread($fp, filesize($array[$i]));
  10. fclose($fp);
  11.  
  12. $zip->addfile($data[$i], $nom);
  13. }
  14.  
  15. $archive = $zip->file() ; //on associe l'archive
  16.  
  17. header('Content-Type: application/x-zip') ; //on détermine les en-tête
  18. header('Content-Disposition: inline; filename='.$repertoire.'.zip') ;
  19.  
  20. echo $archive ;
  21.  
  22. }
  23.  

Supression d'un fichier/répertoire



Pour cette fonction qui prendra un fichier en paramètre, nous allons utiliser unlink et rmdir, qui permetent la suppression d'un fichier et d'un dossier, il faut savoir qu'un dossier ne peut être supprimé que si il est vide, il nous faut alors, vérifier si le fichier visé est un répertoire, si oui supprimer tous c'est fichiers. Nous allons pour cela utiliser la récursivité de notre fonction explorer.


Code PHP :
  1.  
  2. function Supression($fichier)
  3. {
  4. if (is_dir($fichier)) // Blablablablablablabla
  5. {
  6. $contenu_rep = explorer($fichier, true); // On active la récursivité histoire de supprimer le contunue de tous les sous répertoire possible du dossier visé.
  7. for ($i=0; $i<count($contenu_rep); $i++)
  8. {
  9. if (is_file($contenu_rep[$i]))
  10. {
  11. if (!unlink($contenu_rep[$i]))
  12. {
  13. $erreur = 'La suppression du répertoire à planter au fichier '. $contenu_rep[$i];
  14. }
  15. }
  16. }
  17. if (!rmdir($fichier))
  18. {
  19. $erreur = 'La suppression du répertoire à planter au repertoire '. basename($fichier).', essayer de suprimmer ces sous dossiers manuellement';
  20. }
  21. else
  22. {
  23. $erreur = 'La suppression de '. basename($fichier) .' à bien été effectué';
  24. }
  25. }
  26. else
  27. // C'est un fichier, essayons de le del :bavup: !
  28. {
  29. if (!unlink($fichier))
  30. {
  31. $erreur = 'La suppression de '. basename($fichier) . ' à echoué';
  32. }
  33. else
  34. {
  35. $erreur = 'La suppression de '. basename($fichier) .' à bien été effectué';
  36. }
  37. }
  38. return $erreur;
  39. }
  40.  


Les switchs


Maintenant que nos fonctions de gesition de fichiers son prétes, on vas pouvoir s'attaquer a la structure de notre page.
Elle se repartie principalement sur deux switchs, un en amont de notre code, qui portera sur la variable $_POST['action'], permettant la modification de fichiers, et un en aval au plein millieu du corps de notre page html, qui lui portera sur la variable $_GET['action'] permettant l'affichage dynamique de notre corps, ainsi que le traitement de quelques fichiers, a l'attaque ! :)
Code PHP :
  1.  
  2.  
  3. <?php
  4. session_start(); //A ne surtout pas supprimer nous en aurons besoin plus tard pour la gestion MySQL
  5.  
  6. if (isset($_POST['action']))
  7. {
  8. $action = $_POST['action'];
  9. switch($action)
  10. {
  11.  
  12. }
  13. }
  14. ?>
  15.  
  16. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  17. <html xmlns="http://www.w3.org/1999/xhtml">
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  20. </head>
  21. <body>
  22. <div id="header">
  23.  
  24. </div>
  25.  
  26. <div id="menu_haut">
  27. <ul>
  28. <li><a href="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>"/>Gesttionnaire de fichiers</a></li>
  29. <li><a href="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>?action=sql"/>Gestionnaire MySQl</a></li>
  30. <li><a href="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>?action=code"/>Php-Code</a></li>
  31. <li><a href="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>?action=deconnexion"/>Deconnexion</a></li>
  32. </ul>
  33. </div>
  34.  
  35. <div id="corps">
  36. <?php
  37. $action2 = $_GET['action'];
  38. switch($action2)
  39. {
  40.  
  41.  
  42. default;
  43. if ($_GET["repertoire"])
  44. {
  45. if (!@chdir($_GET["repertoire"]))
  46. {
  47. $erreur = "Le changement de répertoire a échoué.";
  48. }
  49. }
  50. listRepertoire();
  51. }
  52. ?>
  53. </div>
  54.  
  55. <hr />
  56. <div id="pres_footer">
  57.  
  58. <fieldset><legend>Créé dossier</legend>
  59. <form action="#" method="post">
  60. <input type="hidden" name="action" value="creedossier" />
  61. <input type="text" name="nom" value="Votre nom de dossier ..." />
  62. <input type="hidden" name="repertoire" value="<?php echo getcwd(); ?>" />
  63. <input type="submit" value="Envoyer" />
  64. </form>
  65. </fieldset>
  66.  
  67. <fieldset><legend>Upload d'un fichier</legend>
  68. <form action="#" method="post" enctype="multipart/form-data">
  69. <input type="file" name="upload" id="upload" />
  70. <input type="hidden" name="repertoire" value="<?php echo getcwd(); ?>" />
  71. <input type="hidden" name="action" value="upload"/>
  72. <input type="submit" value="Envoyer" />
  73. </form>
  74. </fieldset>
  75. </div>
  76. <div id="footer">
  77. <?php if (isset($erreur))
  78. {
  79. echo "<script>alert('$erreur')"; // Çà coule de source, nan ?
  80. }
  81. ?>
  82. </div>
  83.  
  84.  
  85. </body>
  86. </html>
  87.  
  88. <?php
  89.  
  90. /* Toute les fonctions, vous les avez deja, elle seront ici, mais je les zap la, elle mon frustré hier soir, c'est bien fait pour elles */
  91.  
  92. ?>
  93.  


Voila donc le corps de notre page sans ses entrailles. J'en ai profité pour rajouter a la fin deux formulaires, on peut voir qu'ils possèdent bien un champ de type hidden de nom "action" qui servira a donner des instructions au switch. Leurs champ "répertoire" nous permettra de savoir ou créer le dossier et uploder le fichier.
D'ailleurs puisqu'ils sont la ont vas commencer par eux :p

Les deux formulaires du bas



La création du dossier :

Ca création se déroulera en 4 étapes, on vérifie que le champ "nom" n'est pas vide, ensuite grâce à la fonction file_exist, qu'un dossier du même nom n'existe pas déjà, on change de répertoire, et pour finir on le créer.
Code PHP :
  1.  
  2. case 'creedossier':
  3.  
  4. if (isset($_POST['nom']) && !empty ($_POST['nom']))
  5. {
  6.  
  7. $nom = $_POST['nom'];
  8. $repertoire = $_POST['repertoire'];
  9. if (file_exists($repertoire.'/'.$nom ))
  10. {
  11. // Heheheheh pas bien vilain il existe deja o.o
  12. $erreur = "Le dossier " . basename($nom) ." que vous desirez créé existe déja";
  13.  
  14. }
  15. else
  16. {
  17. if (!chdir($repertoire))
  18. {
  19. $erreur = "Le changement de répertoire a échoué.";
  20. }
  21. else
  22. {
  23. // On cree le dosssier
  24. if ( mkdir($nom))
  25. {
  26. $erreur = 'Le dossier ' . basename($nom) .' à bien été crée';
  27. }
  28. else
  29. {
  30. $erreur = 'La création du dossier ' . basename($nomr) .' à echoué';
  31. }
  32.  
  33. }
  34.  
  35. }
  36. }
  37. break;
  38.  


Quand a l'upload de fichier, rien de bien compliqué, on verifie juste que la pressence du fichier, et on le deplace, un upload des plus banal, on l'upload a l'aide de is_uploaded_file ( string $filename ) avant de le deplacer dans le répertoire désiré grâce à move_uploaded_file ( string $filename , string $destination ) :p
Code PHP :
  1. case 'upload':
  2.  
  3. $repertoire = $_POST['repertoire'];
  4. if( isset($_FILES['upload']) ) // si formulaire soumis
  5. {
  6. $tmp_file = $_FILES['upload']['tmp_name'];
  7.  
  8. if( !is_uploaded_file($tmp_file) ) // Fichier present ?
  9. {
  10. exit("Le fichier est introuvable");
  11. }
  12. // Testons si l'extension est autorisée
  13. $fichier = htmlspecialchars($_FILES['upload']['name']);
  14. if (!move_uploaded_file($tmp_file, $repertoire.'/' .$fichier))
  15. {
  16. $erreur = "Erreur impossible de deplacer le ficher dans le repertoire $repertoire";
  17. }
  18. }
  19. else
  20. {
  21. $erreur = "Pas de fichier ...";
  22. }
  23.  
  24. break;


Action modifier un fichier/dossier


La modification du fichier nous permettra de :

- Le renommer,
- Modifier son contenue si c'est un code source, fichier texte ...

La modification du répertoire quand à lui nous permettra de :

- Le renommer

Pour cela, on vas utiliser le deuxième switch, utilisant la variable $_GET['action'] couplet à la variable $_GET['f'], comme décrit au début de ce tutoriel.

On vas donc tous d'abord, récupérer le nom du fichier (ou dossier) et le répertoire courant, on stocke le fichier dans une variable, on change de répertoire.
Ensuite à l'aide d'une condition, on se demande si c'est un fichier grâce à is_file, si oui, on récupère son contenue avec file_get_contents ( string $filename [, int $flags= 0 [, resource $context [, int $offset= -1 [, int $maxlen= -1 ]]]] ).

Pour un plus d'ergonomie, on affiche les informations du fichier, qui précédera deux formulaires :

Renommer le fichier de type post,les informations seront renvoyé et traité dans le 1er switch de notre page (Sur la variable $_POST['action']):

- Renvoyant le répertoire courant
- L'action désiré => renommer
- Le nom du fichier
- Le nouveau nom du fichier

Modification d'un fichier, de type post, les informations seront renvoyé et traité dans le 1er switch de notre page (Sur la variable $_POST['action']) :

- Renvoyant le répertoire courant
- L'action désiré => modifier
- le nom du fichier
- Son contenue (qui sera affiché dans un textarea)

Si is_file nous renvoie false, ce sera donc un répertoire, dans ce cas toujours par soucie d'ergonomie, on affiche les infos du répertoire suivit d'un formulaire :

Renommer le répertoire, de type post, les informations seront renvoyé et traité dans le 1er switch de notre page (Sur la variable $_POST['action']) :

- Renvoyant le répertoire courant (Oui je radote =p )
- L'action désiré => renommer
- Son nom
- Son nouveau nom

Ce qui donne :

Code PHP :
  1. <?php
  2.  
  3. case "modifier":
  4.  
  5. $fichier = $_GET['f'];
  6. $repertoire = $_GET['repertoire'];
  7. chdir($repertoire);
  8. if (is_file($fichier)) // c'est un fichier
  9. {
  10. if (!$contenu = file_get_contents($fichier))
  11. {
  12. $erreur = "Impossible d'ouvrire le fichier";
  13. }
  14. else
  15. {
  16. $contenu = file_get_contents($fichier);
  17.  
  18. }
  19. ?> <hr />
  20. <div id="info_fichier">
  21. <p>Fichier : <?php echo basename($fichier).'&nbsp ('.tailleFichier($fichier).') &nbsp'.afficherPerm($fichier); ?><br />
  22. Repertoire : <?php echo $repertoire.'&nbsp '. afficherPerm($repertoire); ?>
  23.  
  24. <fieldset id="rennomer"><legend><b>Renommer le fichier</b></legend>
  25. <form method="post" action="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>">
  26. <input type="hidden" value="<?php echo getcwd(); ?>" name="repertoire" />
  27. <input type="hidden" value="renomer" name="action" />
  28. <input type="hidden" value="<?php echo $fichier; ?>" name="nom" />
  29. <input type="text" name="new_nom">
  30. &nbsp &nbsp <input type="submit" value="Modifier" />
  31. </form>
  32. </fieldset>
  33. <fieldset id="modif"><legend><b>Modification d'un fichier</b></legend>
  34. <form method="post" action="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>">
  35. <input type="hidden" value="<?php echo getcwd(); ?>" name="repertoire" />
  36. <input type="hidden" value="modifier" name="action" />
  37. <input type="hidden" value="<?php echo $fichier; ?>" name="nom" />
  38. <textarea name="contenu" style="width:100%; height:250px;"><?php if (isset($erreur)) { echo $erreur; } else { echo htmlentities($contenu); } ?> </textarea><br /><br />
  39. <input type="submit" value="Modifier" />
  40. </form>
  41. </fieldset>
  42. </p>
  43. </div>
  44. <?php
  45. }
  46. else // c'est un répértoire
  47. {
  48. ?>
  49. <hr />
  50. <div id="info_fichier">
  51. <p>Repertoire : <?php echo '&nbsp<span style="color:red;">['.basename($fichier).']</span> &nbsp'.afficherPerm($fichier); ?><br />
  52. Chemin : <?php echo $repertoire.'&nbsp '. afficherPerm($repertoire); ?>
  53. <fieldset id="rennomer"><legend><b>Renommer le repertoire</b></legend>
  54. <form method="post" action="http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; ?>">
  55. <input type="hidden" value="<?php echo getcwd(); ?>" name="repertoire" />
  56. <input type="hidden" value="renomer" name="action" />
  57. <input type="hidden" value="<?php echo $fichier; ?>" name="nom" />
  58. <input type="text" name="new_nom">
  59. &nb</form>
  60. </fieldset>
  61. </p>
  62. </div>
  63. <?php
  64. }
  65.  
  66. break;



Traitement modifier un fichier/dossier



Maintenant que l'on à crée l'interface de modification, passont aux traitement des données. Donc on retourne dans notre 1er switch :

Renommer

Pour renomer un fichier ou un répertoire sous php, il n'y a rien de plus simple, dans notre cas, il suffit de récuperer les informations envoyées et d'utiliser la fonction rename ( string $oldname , string $newname [, resource $context ] ).

Code PHP :
  1.  
  2. case 'renomer':
  3.  
  4. $fichier = $_POST['nom'];
  5. $nfichier = $_POST['new_nom'];
  6. $repertoire = $_POST['repertoire'];
  7.  
  8. if (!chdir($repertoire))
  9. {
  10. $erreur = "Le changement de répertoire a échoué.";
  11. }
  12. else
  13. {
  14. if (!rename($fichier, $nfichier))
  15. {
  16. $erreur = "Impossible de renommer $fichier en $nfichier";
  17. }
  18. else
  19. {
  20. $erreur = "$ficher à bien été rennomé en $nfichier";
  21. }
  22.  
  23. }
  24.  
  25. break;
  26.  
  27.  


Modifier le contenue d'un fichier

La encore, rien de bien difficile, nous aurons cas ouvrire le fichier visé en mode ecriture "w" avant d'y inserer le contenue envoyé.

Code PHP :
  1.  
  2. case 'modifier':
  3.  
  4. if(isset($_POST["contenu"]))
  5. {
  6. $fichier = $_POST["nom"];
  7. $repertoire = $_POST['repertoire'];
  8. if (!chdir($repertoire))
  9. {
  10. $erreur = "Le changement de répertoire a échoué.";
  11. }
  12. else
  13. { // Ouverture du fichier
  14. $file = fopen($fichier, "w");
  15. // Ecriture
  16. fwrite($file, stripslashes($_POST["contenu"]));
  17. // Fermeture
  18. fclose($file);
  19. $erreur = 'Le fichier ' . basename($fichier) .' à bien été modifier';
  20. }
  21. }
  22. break;
  23.  

Action télécharger



La demande de téléchargement etant passée par l'url, nous retournons ici dans le deuxieme switch.
Pour le téléchargement, il nous suffira de recupérer le nom et le repertoire du fichier visé, de verifier si c'est un fichier, avant d'envoyer les informations nécessaires aux fonctions de téléchargement précedament crée.

Code PHP :
  1.  
  2. case 'telecharger':
  3.  
  4. $fichier = $_GET['f'];
  5. $repertoire = $_GET['repertoire'];
  6.  
  7. if (is_file($repertoire.'/'.$fichier)) // Simple n'est-ce pas ?
  8. {
  9. telecharger( basename($fichier), $repertoire.'/'.$fichier, fileSize($fichier));
  10.  
  11. }
  12. else
  13. {
  14. $fichiers = explorer($repertoire.'/'.$fichier, true);
  15. zop($fichiers, $fichier);
  16. }
  17.  
  18. break;
  19.  


Action supprimer



De méme, nous n'avons cas envoyer les informations nécessaires à la fonction Supression que l'ont a crée.


Code PHP :
  1.  
  2.  
  3. case 'supprimer':
  4.  
  5. $repertoire = $_GET['repertoire'];
  6. $fichier = $_GET['f'];
  7. // Le changement de repertoire c'est il bien effectue ? Non, erreur ... ='(
  8. if (!chdir($repertoire))
  9. {
  10. $erreur = "Le changement de répertoire a échoué.";
  11. }
  12. // Sinon tentons d effacer le fichier ou le repertoire : )
  13. else
  14. {
  15. $erreur = Supression($fichier);
  16. }
  17. echo $erreur;
  18. break;
  19.  


Et voila ! Félicitation la partie gestion de fichiers est terminé, passons a la gestion MySQL des bases de données !

La gestion MySQL



Tutoriel en cour de construction :

Code du gestionnaire complet : Ici



Remonter