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:
Le problème est que ceci me fabrique une archive corrompu.
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); ?>
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
Partager