Drupal 8 et Drupal 9 - Créer une archive Zip

Posté le Jeudi 27 août 2020 - 09:23

Voici comment créer une archive zip et y ajouter des fichiers.

Pour commencer, nous aurons besoin d'injecter deux services, (ici je suis dans un formulaire, à adapter en fonction du contexte)

  1. public static function create(ContainerInterface $container) {
  2. $instance = parent::create($container);
  3. $instance->fileSystem = $container->get('file_system');
  4. $instance->archiver = $container->get('plugin.manager.archiver');
  5. return $instance;
  6. }

Création de l'archive en tant que telle :

  1. // $files contient un tableau de chemin de fichiers à ajouter à l'archive
  2. $files = ['private://monfichier1.pdf', 'private://monfichier2.pdf'];
  3.  
  4. // Chemin où sera enregistré l'archive
  5. $archivePath = 'private://pdf-export/mon-archive.zip';
  6.  
  7. // On crée l'archive physiquement sur le disque, avec un contenu vide
  8. // FileSystemInterface::EXISTS_REPLACE indique que si le fichier existe déjà on le remplace, il existe d'autres options
  9. $this->fileSystem->saveData('', $archivePath, FileSystemInterface::EXISTS_REPLACE);
  10.  
  11. //On récupère l'objet Zip pointant vers l'archive que nous venons de créer.
  12. /** @var Zip $zip */
  13. $zip = $this->archiver->getInstance(['filepath' => $archivePath]);
  14.  
  15. foreach ($files as $file) {
  16. $filepath = $this->fileSystem->realpath($file);
  17. $zip->add($filepath, $filename);
  18. }

Et voila, cela fonctionne mais ça n'est pas forcément top... Pourquoi pas forcément top ? car toute l’arborescence des différents fichiers est recrée dans l'archive :

Image
Archive Zip

 Ça n'est pas forcement très gênant, mais dans mon cas je préférais avoir tous les fichiers à la racine de mon archive. Voila comment faire :

  1. // $files contient un tableau de chemin de fichiers à ajouter à l'archive
  2. $files = ['private://monfichier1.pdf', 'private://monfichier2.pdf'];
  3.  
  4. // Chemin où sera enregistré l'archive
  5. $archivePath = 'private://pdf-export/mon-archive.zip';
  6.  
  7. // On crée l'archive physiquement sur le disque, avec un contenu vide
  8. // FileSystemInterface::EXISTS_REPLACE indique que si le fichier existe déjà on le remplace, il existe d'autres options
  9. $this->fileSystem->saveData('', $archivePath, FileSystemInterface::EXISTS_REPLACE);
  10.  
  11. //On récupère l'objet Zip pointant vers l'archive que nous venons de créer.
  12. /** @var Zip $zip */
  13. $zip = $this->archiver->getInstance(['filepath' => $archivePath]);
  14.  
  15. // $zip est juste un wrapper Drupal vers un objet \ZipArchive que l'on va récuprérer ici dans $zipArchive
  16. $zipArchive = $zip->getArchive();
  17.  
  18. foreach ($files as $file) {
  19. // on récupère le nom de fichier, sans le chemin
  20. $filename = basename($file);
  21. $filepath = $this->fileSystem->realpath($file);
  22.  
  23. // on ajoute le fichier à l'archive mais en indiquant comme chemin uniquement le nom du fichier, ainsi, plus de création de dossier
  24. $zipArchive->addFile($filepath, $filename);
  25. }

 

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...