Bonjour a tous,
je cherche a faire une archive (zip) d'une arborescence.

Pour ce faire j'utilise la class suivante:
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
 
<?php
/**
 * Class permettant de faire des archives
 * @author Hannibal
 */
class ZipBackup extends ZipArchive { 
 
	/**
	 * Constructeur de la class
	 * $nom = nom de l'archive
	 * $flag = flag d'ouverture de l'archive
	 * $commentaire = commentaire sur l'archive
	 */
	public function __construct($nom, $flag = ZIPARCHIVE::CREATE, $commentaire = ""){
 
		// Si le flag nous indique que l'archive doit etre créé (elle n'existe pas)
		if($flag == ZIPARCHIVE::CREATE)
		{
			if ($this->open($nom, ZIPARCHIVE::CREATE) !== TRUE)
				throw new Exception("L'archive ne peut être créée");
		}
		else if($flag == ZIPARCHIVE::OVERWRITE) //si le flag nous indique que nous ecrasons l'archive
		{
			if(!file_exists($nom)) //elle n'existe pas, on la créer
			{
				if ($this->open($nom, ZIPARCHIVE::CREATE) !== TRUE)
					throw new Exception("L'archive ne peut être créée");
			}
			else
			{
				if (!unlink($nom))
					throw new Exception("L'archive ne peut être écrasé");
 
				if ($this->open($nom, ZIPARCHIVE::CREATE) !== TRUE)
					throw new Exception("L'archive ne peut être créée");
			}
		}
 
		if ($commentaire != "")
			$this->setArchiveComment($commentaire);
	}
 
 
	/**
	 * Methode qui permet d'enregistrer une sous arborescence.
	 * $chemin = chemin vers le dossier a sauvé
	 * $prefixe = argument pour la récursivité
	 */
	public function addRecursive($chemin, $prefixe = '')
    {
		// Creation d'un chemin absolu et ajout du séparateur de fichier
        $chemin = realpath($chemin) . DIRECTORY_SEPARATOR;
 
		// Si le chemin ne mene sur rien
        if (!file_exists($chemin)) 
            throw new Exception("Le chemin '$chemin' n'existe pas");
 
		// si le chemin ne mene pas sur un dossier
        if (!is_dir($chemin)) 
            throw new Exception("Le chemin '$chemin' existe mais n'est pas un répertoire");
 
		// Si il est impossible d'ouvrir le fichier
        if (!($dh = opendir($chemin))) 
            throw new Exception("Le répertoire '$chemin' n'est pas accessible");
 
 
		// on parcour le dossier
        while (($fichier = readdir($dh)) !== FALSE) {
 
			// si le ce n'est pas le lien . ou ..
            if ($fichier != '.' && $fichier != '..') {
 
				// Si c'est un dossier
				if (is_dir($chemin . $fichier)) {
				//	echo "Ajout du dossier: ".$chemin.$prefixe . $fichier."<br/>";
 
					// on creer un dossier vide 
					$this->addEmptyDir($prefixe . $fichier); 
 
					// on lance la récursivité
					$this->addRecursive($chemin . $fichier . DIRECTORY_SEPARATOR, $prefixe . $fichier . DIRECTORY_SEPARATOR);
 
				} else { // ici un fichier
					//echo "Ajout du fichier: ".$chemin. $fichier."<br/>";
 
					// on ajoute le fichier
					if (!$this->addFile($chemin . $fichier, $prefixe . $fichier)) 
						throw new Exception("Le fichier '$chemin/$fichier' n'a pu être ajouté à l'archive");
				}
 
			}
        }
 
		// on ferme le pointeur
        closedir($dh);
    }
}
 
?>

Et je l'utilise ainsi:
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
 
<?php
include('ZipBackup.php');
 
//le nom de l'utilisateur a backup
$user="test";
 
//le chemin vers le dossier personnel de l'utilisateur
$dossier="./".$user;
 
$archive=$user."_".date('d-m-Y').".zip";
 
header('Content-Type: application/x-zip');
header("Content-Disposition: attachment; filename=".$archive);
 
 
$zip=new ZipBackup($user."_".date('d-m-Y').".zip");
$zip->addRecursive($dossier);
$zip->close();
 
readfile($archive);
 
 
?>
Le problème est que ceci me fabrique une archive corrompu.
Voici une image qui illustre le problème:



Donc avez vous une idée de pourquoi j'ai ce problème ?
J'ai oublié quelque chose ?

Merci d'avance pour votre aide