IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Listing directory avec 20000 fichiers


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Listing directory avec 20000 fichiers
    Voilà je dois dévellopper une interface permettant de parcourir un répertoire, selectionner les fichiers via checkbox au fur et à mesure, puis via un bouton faire une archive et l'envoyer à l'utilisateur.

    N'étant pas une lumière enn dev je m'oriente vers du php et je m'en sors pas trop mal grâce à ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link href="css/styles.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" language="JavaScript">
    function CheckChildren(id,status)
    {
     
    	for(var i=0;i<document.form.length;i++){
     
    		if(document.form.elements[i].type=="checkbox" && document.form.elements[i].id==id){
    			document.form.elements[i].checked=status;
    		}
     
    		}
    } 
     
     
    </script>
    <title>Tree Folder</title>
    </head>
     
    <body >
     <img src=images/aologo.jpg width=30% height=30% align='right'></img>
    	<h2>OpenText Folder from <?php echo $_GET['url'];?> </h2>
     Clik on folder to expand<br /><br />
     
     Select file and clik on Zip&Download button to download an archive file
     
     
    <br /><br />
    <?php 
     
    require_once('C:\Program Files\EasyPHP5.3.0\phpmyadmin\libraries\zip.lib.php');
    /* ******************************************************************************* */
    // function listingDir par DEHAN Thomas
    // Fonction récursive permettant de générer une arborescence de fichiers
    // $path : chemin du dossier à lister
    // $profondeur : nombre de dossier à explorer par rapport à $path 
    // $profdep = 0 : ne pas toucher, valeur de départ
    // $id=0 : permet par la suite d'identifier les fichiers enfants des dossiers parents
    /* ******************************************************************************* */
     
    function listingDir($path, $profondeur=9999, $profdep=0,$id=0  ) {
    echo is_dir($path);
    if (is_dir($path)) {
    	if (substr($path, -1, 1) !='/') {
    			$path .= '/';
    			}
    }
     
    //echo 'profdep='.$profdep.'<br />';
    //on compte le nb de / au lancement
    if ($profdep == 0) {
      $profdep= substr_count($path, '/');
    }
     
    		if (is_dir($path)) {		  
    		//on definit le nom du dossier à afficher
    		if (substr($path, -1, 1) =='/') { //si ça finit par un slash on le vire pr avoir le nom du dossier
    			$dirnam = substr($path, 0,(strlen($path)-1)); //on vire le dernier shash
        	} else { 
        		$dirnam = substr($path, 0,(strlen($path))); //on garde le nom du dossier comme ça
        		//$path.= '\\'; //et on ajoute un slash a la fin du path pr avoir d chemins ok
        	}
        	$dirnam = strrchr($dirnam, "/"); // on recup le nom du dernier dossier
    		$dirnam = str_replace (array('/'), array(''), $dirnam); // on vire le 1er shash
    		if ($dirnam == '') 
    			echo '<strong><a href="#" onclick="if (document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display!=\'block\') {document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display=\'block\';} else { document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display=\'none\'  }">OpenText Folder</a></strong><br /><div id="level'.$profondeur.$dirnam.'" style=" margin-left: 15px; display: none;">'."\n";
     
    		else{
    		echo '<input name="chkdir[]" value='.$id.$dirnam.' type="checkbox" onclick="if (this.checked) {CheckChildren(\''.$id.$dirnam.'\',true)} else {CheckChildren(\''.$id.$dirnam.'\',false)};">';
        	echo '<strong><a href="#" value='.$path.' onclick="if (document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display!=\'block\') {document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display=\'block\';} else { document.getElementById(\'level'.$profondeur.$dirnam.'\').style.display=\'none\'  }">- '.$dirnam.'</a></strong><br/><div id="level'.$profondeur.$dirnam.'" style=" margin-left: 15px; display: none;">'."\n";
    		}
        	if ($dh = @opendir($path)) {
        		//Récupération des dossiers et des fichiers dans 2 tableaux différents
        			$tab_file=array();
        			$tab_dir=array();
    				while (($file = readdir($dh)) !== false) {
    					if (($file == '.') || ($file == '..')){
    					}else if (is_dir($path . $file)) {
    							$tab_dir[]=$file;
    						}else $tab_file[]=$file;
     
    				}//Tri des tableaux
    				sort($tab_file);
    				sort($tab_dir);
     
    				foreach ($tab_dir as $elem1){
     
    					listingDir(($path.$elem1),$profondeur-1, $profdep,$id+1);
    				}
     
    				foreach($tab_file as $elem2){
     
    					echo '<input name="chkfile[]" value='.$path.$elem2.' id='.$id.$dirnam.' type="checkbox" a href="'.$path.$elem2.'">'. $elem2.'</a><br>'."\n";
    				}
     
    	       		closedir($dh);
    				echo '</div>'."\n";
    			}
    		}
     
    }
    $zip = new ZipArchive();
     
     
    $time=time();
    if(!isset($_POST["chkfile"])) {
    	//echo "Aucun fichier sélectionné";
    }else {
    	// On ouvre l'archive
    	if($zip->open('Archive'.$time.'.zip') == TRUE)
    		  // On crée l'archive
    		if($zip->open('Archive'.$time.'.zip', ZipArchive::CREATE) == TRUE)
    	 	{
    		    echo '&quot;Zip.zip&quot; ouvert';
    			for ($i = 0; $i < count($_POST["chkfile"]); $i++){
    				$filename = $_POST["chkfile"][$i];
    				$zip->addFile($filename);
    			}
    		    $zip->close();
    			}else
    		      {
    		        echo 'Impossible d'ouvrir &quot;Zip.zip&quot;';
    		      }      
    		      // On peut ensuite si on veut comme dans le tuto de DHKold proposer le téléchargement
    	  header('Content-Type: application/x-zip') ; //on détermine les en-tête
    	  header('Content-Transfer-Encoding: binary'); //Transfert en binaire (fichier)
    	  header('Content-Disposition: attachment; filename="Archive.zip"'); //Nom du fichier
    	  header('Content-Length: '.filesize('Archive.zip')); //Taille du fichier
    	  
    	  readfile('Archive'.$time.'.zip');
    	  
    		}
    ?>
     
     
     
    <FORM method="POST" name="form">
    ---------------------------------------------------------------------------------------------------------------------------
    <br></br>
    <input type="Submit" value="Zip&Download">
     
      <br></br><br></br><br></br>
    <?php 
    listingDir('\\aofrso001\star2');
    ?>
     
     
    </FORM>
    </body>
    </html>
    Tout fonctionne bien, ainsi que l'autocheck des éléments enfant lors d'un click sur un dossier. Tout fier de moi et de mes tests en local et sur le serveur je décide de cibler le dossier définitif.

    Et là malheur, le dossier possède une arborescence de fou et la page met 20sc a chargé puis a chaque clic d'un checkbox, la page fige pendant 20sc le temps de tout parcourir.

    Je cherche donc le moyen d'optimiser mon code pour éviter ces problèmes sans avoir a tout refaire depuis le début.

    Il faudrait le faire en dynamique et ainsi ne créer l'arborescence qu'au fur et a mesure des ouvertures dossiers. Au lieu de partir sur du récursif plutôt faire du step by step

    Merci de votre aide

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Je te propose de potasser un peu l'AJAX, qui n'est pas vraiment un langage mais plutôt un mix de php et javascript.
    Tu trouveras de très bons tutos sur ce site.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/03/2010, 16h30
  2. retrouver url fichier attaché à un list item avec JQuery
    Par no_seb dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 23/09/2009, 16h06
  3. Réponses: 1
    Dernier message: 23/09/2009, 16h06
  4. liste déroulante avec lien sur autre fichier
    Par orionis1 dans le forum Excel
    Réponses: 6
    Dernier message: 14/01/2008, 15h56
  5. Réponses: 3
    Dernier message: 25/10/2007, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo