Bonjour a tous,
je cherche a faire une archive (zip) d'une arborescence.
Pour ce faire j'utilise la class suivante:
Code :
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 :
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