new ZipArchive()

20 mai 2013 nakama

Développement

(Cet article a été écrit il y a très longtemps, dans une galaxie très très lointaine)

Nous allons voir comment créer un ZIP à partir d’un dossier que l’on aura spécifié.

On va utiliser la classe ZipArchive de php et créer une classe perso qui va contenir tout le script (par exemple zip.php).

Le début

Je pense qu’une explication est inutile, les variables commencent par $exclude vont nous permettre d’exclure certain fichier/dossier.

Le constructeur

Grâce au constructeur, dès que l’on va instancier la classe, tous ces éléments seront exécutés.

Explications :

– on instancie la classe ZipArchive de php
– on configure le nom du zip et le chemin du fichier (root)
– on vérifie que le fichier est bien un dossier
– on crée le dossier qui va sauvegarder le zip s’il n’existe pas
– on crée l’archive

Les méthodes

Les méthodes sont en public, car on va devoir les appeler en dehors de la classe pour spécifier les fichiers à exclure et elles prennent toutes en paramètre un tableau.

Pour la méthode excludeFiles et excludeFolders, le foreach sert à rajouter le nom du dossier que l’on va zip. Comme cela, quand on va spécifier les fichiers/dossiers à exclure, il ne sera pas utile d’ajouter à chaque fois le dossier que l’on souhaite zip (se sera plus clair dans la partie instanciation de la classe perso un peu plus bas).

Cette méthode nous sert à créé le zip, à le proposer en téléchargement et à le supprimer ou non du dossier (utile si l’on souhaite uniquement le proposer au téléchargement et ne rien conserver sur le serveur).

On fait appel à notre méthode addDir pour ajouter tous les fichiers/dossiers au zip.

Les 2 paramètres ne sont pas obligatoire :

– si le 1er vaut TRUE alors on propose le téléchargement
– si le 2e vaut TRUE alors on supprime le fichier, après l’avoir proposé en téléchargement

Le 2e paramètre est lié au 1er, on peut choisir de conserver ou non le fichier uniquement après avoir téléchargé le fichier !

La dernière méthode : récursive ?

Déjà, avant tout, que signifie récursive ? Regardez la ligne 14, on fait de nouveau appel à la méthode addDir. Récursive signifie que la méthode s’appelle elle-même.

Explications :

– on scan le fichier
– on supprime le . (dossier actuel) et les .. (dossier parent)
– on teste si le fichier est un dossier ou non
– s’il s’agit d’un fichier, on vérifie qu’il ne se trouve pas dans les tableaux des fichiers à exclure et s’il ne s’y trouve pas, on l’ajoute à l’archive.
– s’il s’agit d’un dossier, on vérifie qu’il ne se trouve pas le tableau des dossiers à exclure et s’il ne s’y trouve pas, on appelle de nouveau la méthode addDir pour récupérer le contenu du dossier.

Ce fonctionnement est le même pour chaque dossier et sous-dossier, jusqu’à ce qu’il n’y ait plus de dossier à parcourir.

Pas de panique

La méthode récursive reprend là où elle s’arrête : (exemple)

– dans un dossier (img) qui contient des images et un sous-dossier avec d’autres images
– la méthode ajoute les fichiers au zip et arrive au sous-dossier
– elle fait appel de nouveau à la méthode et parcours le sous-dossier en ajoutant les fichiers
– une fois fini, elle continue d’ajouter le reste des fichiers du dossiers précédent

Le mécanisme de récursivité est assez complexe à comprendre au début, mais en vous entrainant à l’utiliser vous vous sentirez beaucoup plus à l’aise avec ce fonctionnement.

Le fichier qui fait appel au script de zip

Par exemple : download.php

Explications :

– on ajoute notre classe perso et on l’instancie
– on précise les fichiers/dossiers à exclure
– on appelle la méthode qui va créer le zip et le proposer en téléchargement

La structure que j’ai utilisé pour le test :

Les éléments surlignés ne seront PAS pris en compte dans le zip (avec le fichier download.php vu juste avant). Nom de l’archive qui sera créée : siteWeb-20130519-2259.zip

Attention : un dossier vide ne sera pas ajouté au zip.

Mots-clés associés à cet article :

Retrouvez d'autres articles par catégories

Donec luctus massa adipiscing sem, Nullam consequat. id mattis id elit.