Création d’un fichier zip en PHP
Lors d’un projet j’ai eu à créer un fichier zip pour télécharger un ensemble de fichiers et j’ai été confronté à un bug, le zip bien que faisant la taille voulue, ne contenait aucune donnée, voici donc un bout de code permettant de générer un fichier zip à partir d’une liste de fichiers, ainsi que l’astuce pour avoir le contenu à coup sur.
private function _createZip ($dir, $files) {
// Define the zip name
$zipname = $dir.DIRECTORY_SEPARATOR.'archive.zip';
// Delete zip if already existing
if (file_exists($zipname)) {
unlink($zipname);
}
// Create zip
$zip = new ZipArchive();
$zip->open($zipname, ZipArchive::CREATE);
// Add files
foreach ($files as $file) {
if (file_exists($dir.DIRECTORY_SEPARATOR.$file)) {
$zip->addFile($dir.DIRECTORY_SEPARATOR.$file, $file);
}
}
// Close ZIP
$zip->close();
}
Dans ce code, les 2 paramètres sont :
- Le répertoire où se trouvent les fichiers cibles et l’emplacement du zip, on peut tout à fait placer le zip à un autre endroit en passant un autre paramètre.
- Les fichiers à ajouter sous forme d’un tableau
Le point important est le 2ème paramètre de la ligne :
$zip->addFile($dir.DIRECTORY_SEPARATOR.$file, $file);
En effet si votre répertoire est le répertoire courant il n’y aura aucun souci, par contre si vous êtes dans un autre répertoire, et que vous ne définissez pas le nom du fichier cible dans le zip, la librairie prendra le premier paramètre mais ce dernier contenant un répertoire, il ne sera pas ajouté à l’archive et sera donc invisible.
Une autre possibilité est de créer l’arborescence du répertoire dans le zip en utilisant addEmptyDir
Voilà, avec ce code, vous pourrez facilement créer vos zip sans problème.