Bonjour à tous,

je cherches depuis tout la nuit dernière déjà comment faire pour zipper un dossier entier...

Comme je n'ai rien trouvé, j'ai essayé de lister le nom de tous les fichiers de ce dossier, pour ensuite Pour cela j'utilise je ne sais combien de boucle while, dans des foreach, qui sont eux même dans des while...
Mais je suis bloqué à un endroit où j'aurais besoin de lister un array, dans un autre array... Je ne sais pas si je suis assez clair... voici donc mon code...

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
 
<?php
 
if($_SESSION['type']!=sha1('admin'))header('Location: index.php');
 
//import de la classe 
require_once('core/projet.c.php');
require_once('core/projetdossier.c.php');
 
//indique le chemin d'accès à la lib
require("zip.lib.php") ;
 
 
//affichage
echo '<div class="head_main">'
        .'<h2>Sauvegarde d\'un projet</h2>'
    .'</div>'
    .'<div class="content">';
 
 
// importation du tableau 
Projet::listingSave();
 
 
//connexion bdd
$connexion = PDO2::getInstance();
 
//autorisation de requetes multiples
$connexion->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
 
 
//si on intercepte un projet à sauvegarder
if(isset($_GET['id'])) 
{
 
	//on récupère l'id du projet sélectionné 
	$id = $_GET['id'];
 
	$monfichier = fopen('fichiers_sauve/mess.txt', 'w+');
 
	// requete permettant la selection de tous les messages d'un même projet. 
	$message = $connexion->prepare("SELECT * FROM messages, projets WHERE projets.projet_id=messages.projet_id AND projets.projet_id='$id'");
	$message-> execute();
 
 
 
	// liste tous les messages du forum en fonction du projet souhaité
	while ($donnees = $message->fetch(PDO::FETCH_OBJ))
	{    
		// suppression des balises <p> dans message
		$text = $donnees->message_contenu; 
		$text = preg_replace('#<p>(.+)</p>#isU','$1', $text);
		$donnees->message_contenu = $text;
 
 
		$messForum = array("Titre: ".$donnees->message_titre."\n  Date: ".$donnees->message_date."\n  Auteur:".$donnees->message_auteur."\n  Contenu message:" .$donnees->message_contenu,"\n");
		foreach ($messForum as $cle)
		{	
			?><pre><?php//    print_r($cle); ?></pre>
			<?php fputs($monfichier, $cle."\n");
		}
	}
 
	fclose($monfichier);
	$message->closeCursor(); 
}	
 
////////////////////////////////////////////////
// Creation du fichier zip 
////////////////////////////////////////////////
 
 
 
    //on crée une instance zip
    $zip = new zipfile () ; 
 
 
    // retourne le nom du dossier des uploads du projet selectionné. 
	$fichier_upload = $connexion->prepare("SELECT projet_nom FROM projets WHERE projet_id ='$id'");
	$fichier_upload-> execute();
 
	$fi = $fichier_upload->fetch(PDO::FETCH_OBJ);
 
	foreach($fi as $c=>$v){    
    //print_r($v); 
    $rep = "uploads/".$v."/";
 
    // choix et ouverture du répertoire où se situe les uploads du projet selectionné. 
	$dir = opendir($rep);    
 
 
    // liste le nom de tous les fichiers se situant dans uploads/<nom du projet à enregistrer>
	$tableau = array();
	while ($f = readdir($dir)) {
 
   			if(is_file($rep.$f)) 
   			{
			$tableau[]=	$f ;
      		}
    }
 
    foreach($tableau as $cc=>$vv)
    {
 
      $files = array ( 'fichiers_sauve/mess.txt', 'uploads/'.$v.'/'.$vv) ;	
 
      		$i = 0 ;
		    while ( count( $files ) > $i )   {
 
        		$fo = fopen($files[$i],'r') ; //on ouvre le fichier
		        $contenu = fread($fo, filesize($files[$i])) ; //on enregistre le contenu
        		fclose($fo) ; //on ferme fichier
 
		        $zip->addfile($contenu, $files[$i]) ; //on ajoute le fichier
        		$i++; //on incrémente i
 
				// on associe l'archive
    			       $archive = $zip->file() ; 
 
			    // on enregistre l'archive dans un fichier
			    $open = fopen( "fichiers_sauve/sauvegarde".$id.".zip" , "wb");
			    fwrite($open, $archive);
			    fclose($open);
    		}
 
    }
 
//    print_r($tableau);
 
    // liste des fichiers à compresser    
   } 
	unlink('fichiers_sauve/mess.txt');
 
	echo '</div>'.'</p>';
 
?>

Et voici la librairie que j'utilise pour le zipage: zip.lib.php
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
 
<?php
/* $Id: zip.lib.php,v 2.4 2004/11/03 13:56:52 garvinhicking Exp $ */
// vim: expandtab sw=4 ts=4 sts=4:
 
 
/**
 * Zip file creation class.
 * Makes zip files.
 *
 * Based on :
 *
 *  http://www.zend.com/codex.php?id=535&single=1
 *  By Eric Mueller <eric@themepark.com>
 *
 *  http://www.zend.com/codex.php?id=470&single=1
 *  by Denis125 <webmaster@atlant.ru>
 *
 *  a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
 *  date and time of the compressed file
 *
 * Official ZIP file format: http://www.pkware.com/appnote.txt
 *
 * @access  public
 */
class zipfile
{
    /**
     * Array to store compressed data
     *
     * @var  array    $datasec
     */
    var $datasec      = array();
 
    /**
     * Central directory
     *
     * @var  array    $ctrl_dir
     */
    var $ctrl_dir     = array();
 
    /**
     * End of central directory record
     *
     * @var  string   $eof_ctrl_dir
     */
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
 
    /**
     * Last offset position
     *
     * @var  integer  $old_offset
     */
    var $old_offset   = 0;
 
 
    /**
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two bytes allowing magnitude comparison).
     *
     * @param  integer  the current Unix timestamp
     *
     * @return integer  the current date in a four byte DOS format
     *
     * @access private
     */
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
 
        if ($timearray['year'] < 1980) {
            $timearray['year']    = 1980;
            $timearray['mon']     = 1;
            $timearray['mday']    = 1;
            $timearray['hours']   = 0;
            $timearray['minutes'] = 0;
            $timearray['seconds'] = 0;
        } // end if
 
        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    } // end of the 'unix2DosTime()' method
 
 
    /**
     * Adds "file" to archive
     *
     * @param  string   file contents
     * @param  string   name of the file in the archive (may contains the path)
     * @param  integer  the current timestamp
     *
     * @access public
     */
    function addFile($data, $name, $time = 0)
    {
        $name     = str_replace('\\', '/', $name);
 
        $dtime    = dechex($this->unix2DosTime($time));
        $hexdtime = '\x' . $dtime[6] . $dtime[7]
                  . '\x' . $dtime[4] . $dtime[5]
                  . '\x' . $dtime[2] . $dtime[3]
                  . '\x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');
 
        $fr   = "\x50\x4b\x03\x04";
        $fr   .= "\x14\x00";            // ver needed to extract
        $fr   .= "\x00\x00";            // gen purpose bit flag
        $fr   .= "\x08\x00";            // compression method
        $fr   .= $hexdtime;             // last mod time and date
 
        // "local file header" segment
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        $c_len   = strlen($zdata);
        $fr      .= pack('V', $crc);             // crc32
        $fr      .= pack('V', $c_len);           // compressed filesize
        $fr      .= pack('V', $unc_len);         // uncompressed filesize
        $fr      .= pack('v', strlen($name));    // length of filename
        $fr      .= pack('v', 0);                // extra field length
        $fr      .= $name;
 
        // "file data" segment
        $fr .= $zdata;
 
        // "data descriptor" segment (optional but necessary if archive is not
        // served as file)
        // nijel(2004-10-19): this seems not to be needed at all and causes
        // problems in some cases (bug #1037737)
        //$fr .= pack('V', $crc);                 // crc32
        //$fr .= pack('V', $c_len);               // compressed filesize
        //$fr .= pack('V', $unc_len);             // uncompressed filesize
 
        // add this entry to array
        $this -> datasec[] = $fr;
 
        // now add to central directory record
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";                // version made by
        $cdrec .= "\x14\x00";                // version needed to extract
        $cdrec .= "\x00\x00";                // gen purpose bit flag
        $cdrec .= "\x08\x00";                // compression method
        $cdrec .= $hexdtime;                 // last mod time & date
        $cdrec .= pack('V', $crc);           // crc32
        $cdrec .= pack('V', $c_len);         // compressed filesize
        $cdrec .= pack('V', $unc_len);       // uncompressed filesize
        $cdrec .= pack('v', strlen($name) ); // length of filename
        $cdrec .= pack('v', 0 );             // extra field length
        $cdrec .= pack('v', 0 );             // file comment length
        $cdrec .= pack('v', 0 );             // disk number start
        $cdrec .= pack('v', 0 );             // internal file attributes
        $cdrec .= pack('V', 32 );            // external file attributes - 'archive' bit set
 
        $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
        $this -> old_offset += strlen($fr);
 
        $cdrec .= $name;
 
        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir[] = $cdrec;
    } // end of the 'addFile()' method
 
 
    /**
     * Dumps out file
     *
     * @return  string  the zipped file
     *
     * @access public
     */
    function file()
    {
        $data    = implode('', $this -> datasec);
        $ctrldir = implode('', $this -> ctrl_dir);
 
        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
            pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall
            pack('V', strlen($ctrldir)) .           // size of central dir
            pack('V', strlen($data)) .              // offset to start of central dir
            "\x00\x00";                             // .zip file comment length
    } // end of the 'file()' method
 
} // end of the 'zipfile' class
?>

Merci d'avance pour vos réponses!!!