Aller au contenu | Aller au menu | Aller à la recherche

Site membre du réseau Izardev et LCNET

Dezipper en PHP en conservant l'arborescence du ZIP

Comment dézipper un fichier en PHP en conservant l'arborescence des dossiers à l'intérieur du ZIP. ON trouve en effet pas mal de fonctions toutes faites sur le net (oui, j'aime le copier/coller), cependant, je n'en avais pas trouvé qui conservent également l'arborescence des dossiers du fichier Zippé.

Inutile de signaler qu'il faut tout de même avoir chargé l'extension ZIP de PHP (elle y est par défaut sans doute ?).

Fonction PHP

  /**
   * Dezippe un fichier en conservant l'arboresence du ZIP
   * @param string $zipfile
   * @param string $dest
   * @param bool 
   */
  function _unzip($zipfile, $dest)
  {
    if (extension_loaded('zip'))
    {
      $zip = zip_open($zipfile);
      if (substr( $dest, strlen( $dest ) - 1 ) != '/')
        $dest = $dest . '/';
      if ($zip)
      {
        while ($zip_entry = zip_read($zip))
        {
          $file = zip_entry_name($zip_entry);
          //print $file;
          $aFolderStructure = preg_split('@[\\|/]@', $file);
          if (count($aFolderStructure) > 1)
          {
            $f = '';
            for ($i = 0; $i < count($aFolderStructure) - 1; $i++)
            {
              if (!file_exists($dest . $f . $aFolderStructure[$i]) && !is_dir($dest . $f . $aFolderStructure[$i]))
              {
                mkdir($dest . $f . $aFolderStructure[$i], 0666);
                $f = $f . $aFolderStructure[$i] . '/';
              }
            }
          }
          //$file = zip_entry_name($zip_entry);
          $fp = @fopen($dest . $file, "w+");
          if (zip_entry_open($zip, $zip_entry, "r"))
          {
            $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            zip_entry_close($zip_entry);
          }
          fwrite($fp, $buf);
          fclose($fp);
        }
        zip_close($zip);
        return true;
      }
      return false;
    }
  }

C'est tout ;)

Articles connexes

Partagez cet article !

  • Delicious
  • Stumbleupon
  • Digg
  • Facebook
  • Google
  • Linkedin
  • Yahoo Buzz
  • Twitter
Vous avez apprécié cet article ?

Commentaires S'abonner au flux RSS des commentaires

  1. David Graffagnino | Re: Modification de votre fonction pour gérer l'arborences total du zip |
    Aucun soucis, c'est avec plaisir.

    Merci en tout cas pour la fonction, elle sera très utile
  2. Stéphane Le Merre | Re: Modification de votre fonction pour gérer l'arborences total du zip |
    Merci David, effectivement je ne devais avoir besoin que d'un niveau, j'avais pas fais dans le recursif !
    Avec votre permission j'éditerais l'article à l'occasion en mettant un lien vers votre site :)
  3. David Graffagnino | Modification de votre fonction pour gérer l'arborences total du zip |
    Bonjour,
    Merci pour cette fonction qui est excellente et me laisse entrevoir des possibilités assez sympathique.
    Petit soucis que j'ai rencontré c'est qu'elle ne gérait qu'un seul niveau de dossier.

    Ce dont j'avais besoin c'est de reproduire l'architecture totale du zip dans le dossier de sortie.

    Je me permets donc de mettre la correction de votre fonction pour gérer l'arborescence totale du zip pour le reproduire en sortie.

    <?php
    /**
    * Dezippe un fichier en conservant l'arboresence du ZIP
    * @param string $zipfile
    * @param string $dest
    * @param bool
    */
    function _unzip($zipfile, $dest)
    {
    if (extension_loaded('zip')){
    $zip = zip_open($zipfile);
    if (substr( $dest, strlen( $dest ) - 1 ) != '/')
    $dest = $dest . '/';

    if ($zip){
    while ($zip_entry = zip_read($zip))
    {
    $file = zip_entry_name($zip_entry);
    $aFolderStructure = preg_split('@[\\|/]@', $file);

    if (count($aFolderStructure) > 1){
    for ($i = 0; $i < count($aFolderStructure) - 1; $i++){
    $dossierFull = $dest;
    for ($j = 0; $j < count($aFolderStructure) - 1; $j++){
    if (substr( $dossierFull, strlen( $dossierFull ) - 1 ) != '/')
    $dossierFull = $dossierFull . '/';

    $dossierFull = $dossierFull . $aFolderStructure[$j];
    }

    if (!file_exists($dossierFull) && !is_dir($dossierFull))
    mkdir($dossierFull, 0666);
    }
    }

    if(!is_dir($dest . $file)){
    $fp = @fopen($dest . $file, "w+");

    if(zip_entry_open($zip, $zip_entry, "r")){
    $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
    zip_entry_close($zip_entry);
    }

    fwrite($fp, $buf);
    fclose($fp);
    }
    }
    zip_close($zip);
    return true;
    }
    return false;
    }
    }
    ?>


    Je vous remercie en tout cas pour la très grosse base de votre fonction, qui va m'apporter beaucoup dans le futur
  4. FOnction éditée, petit souci, j'utilisais une autre fonction de la classe dedans, c'est réglé :)

Ajouter un commentaire

Les commentaires sont tous validés par un modérateur, votre commentaire n'apparaît pas directement sur le site.
Aucun support n'est assuré ici, vous pouvez néanmoins laisser vos remarques et critiques sur l'article, les points de vue pertinents sont toujours les bienvenus.