Exemple #1
0
 /**
  * Dezipper une archive contenant un ensemble de fichiers dans un dossier, avec son arborescence.
  * 
  * Inspiré de http://fr.php.net/manual/fr/ref.zip.php#79057
  * A l'origine pour remplacer $zip = new ZipArchive(); $result_open = $zip->open($fichier_import); qui plante sur le serveur Nantais s'il y a trop de fichiers dans le zip (code erreur "5 READ").
  * Mais il s'avère finalement que ça ne fonctionne pas mieux...
  * 
  * @param string   $chemin_fichier_zip
  * @param string   $dossier_dezip
  * @param bool     $use_ZipArchive   FALSE permet de nettoyer les noms des fichiers extraits : à préférer donc
  * @return int     code d'erreur (0 si RAS)
  */
 public static function unzip($chemin_fichier_zip,$dossier_dezip,$use_ZipArchive)
 {
   // Utiliser la classe ZipArchive http://fr.php.net/manual/fr/class.ziparchive.php (PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
   if($use_ZipArchive)
   {
     $zip = new ZipArchive();
     $result_open = $zip->open($chemin_fichier_zip);
     if($result_open!==TRUE)
     {
       return $result_open;
     }
     $zip->extractTo($dossier_dezip);
     $zip->close();
   }
   // Utiliser les fonctions Zip http://fr.php.net/manual/fr/ref.zip.php (PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PECL zip >= 1.0.0)
   else
   {
     $ds = (substr($dossier_dezip,-1)==DS) ? '' : DS ;
     $contenu_zip = zip_open($chemin_fichier_zip);
     if(!is_resource($contenu_zip))
     {
       return $contenu_zip;
     }
     while( $zip_element = zip_read($contenu_zip) )
     {
       zip_entry_open($contenu_zip, $zip_element);
       if (substr(zip_entry_name($zip_element), -1) == DS)
       {
         // C'est un dossier
         mkdir( $dossier_dezip.$ds.zip_entry_name($zip_element) );
       }
       else
       {
         // C'est un fichier
         file_put_contents( $dossier_dezip.$ds.Clean::zip_filename(zip_entry_name($zip_element)) , zip_entry_read($zip_element,zip_entry_filesize($zip_element)) );
       }
       zip_entry_close($zip_element);
     }
     zip_close($contenu_zip);
   }
   // Tout s'est bien passé
   return 0;
 }