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 ;)













Merci en tout cas pour la fonction, elle sera très utile
Avec votre permission j'éditerais l'article à l'occasion en mettant un lien vers votre site :)
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