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