[php] fonction Zip ok, par contre, le zip "retient" l'arborecence

fonction Zip ok, par contre, le zip "retient" l'arborecence [php] - PHP - Programmation

Marsh Posté le 04-06-2009 à 17:59:09    

Bon, désolé pour le titre plus que vaseux, mais pas simple d'expliquer mon soucis :
 
J'utilise une fonction pour zipper un répertoire (je poste le code plus bas à la fin de ce post), le zip se fait, ca c'est ok.
Par contre, quand on ouvre le zip, on a toute l'arborescence du systeme jusqu'à l'endroit où sont les fichiers. C'est "moche" :/
J'ai indiqué au script des chemin relatifs pour localiser les fichiers, et rebellote, le meme principe, mais relativement à l'endroit d'où j'execute ce script.
 
Edit (en plus du reste) : vous remarquerez le répertoire vide avant d'acceder au fichiers :/
 
Voici une copie d'écran exemple :  
 
http://hfr-rehost.net/preview/self/pic/a29602fde76407887b7885d48a4bc0eed6930152.jpeg
 
Le code de ma fonction de zippage de répertoire
 

Code :
  1. function zipper($lerepertoire){
  2. require_once("zip.lib.php" );       // librairie zip.lib
  3. $fichier_zip = $lerepertoire.".zip";         // nom du fichier zip que l'on veut
  4. $zip= new zipfile;
  5. $path = "./documents_actualite/".$lerepertoire."/";            // repertoire que l'on veut zipper
  6. set_time_limit (10000);            // a parametrer selon vos souhaits
  7. function zipDir($path,&$zip)
  8. {
  9.  
  10.    if (!is_dir($path)) return;
  11.  
  12.    if (!($dh = @opendir($path))) {
  13.       echo("<b>ERREUR: Une erreur s'est produite sur ".$path."</b><br />" );
  14.       return;
  15.    }
  16.    while ($file = readdir($dh)) {
  17.      
  18.       if ($file == "." || $file == ".." ) continue; // Throw the . and .. folders
  19.       if (is_dir($path."/".$file)) { // Recursive call
  20.          zipDir($path."/".$file,$zip,$i); 
  21.       } elseif (is_file($path."/".$file)) { // If this is a file then add to the zip file
  22.        
  23.          $zip->addFile(file_get_contents($path."/".$file),$path."/".$file);
  24.          //echo('fichier '.$path.'/'.$file.' ajouté<br>');
  25.       }
  26.       }
  27. }
  28. zipDir($path,$zip);
  29. $filezipped=$zip->file();       // On recupere le contenu du zip dans la variable $filezipped
  30. $open = fopen("./documents_actualite/".$fichier_zip, "w" );    // On la sauvegarde dans le meme repertoire que les fichiers a zipper
  31. fwrite($open, $filezipped);
  32. fclose($open);
  33. }


 
 
code de la libraire zip.lib

Code :
  1. <?php
  2. /* $Id: zip.lib.php,v 2.4 2004/11/03 13:56:52 garvinhicking Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4. /**
  5. * Zip file creation class.
  6. * Makes zip files.
  7. *
  8. * Based on :
  9. *
  10. http://www.zend.com/codex.php?id=535&single=1
  11. *  By Eric Mueller <eric@themepark.com>
  12. *
  13. http://www.zend.com/codex.php?id=470&single=1
  14. *  by Denis125 <webmaster@atlant.ru>
  15. *
  16. *  a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
  17. *  date and time of the compressed file
  18. *
  19. * Official ZIP file format: http://www.pkware.com/appnote.txt
  20. *
  21. * @access  public
  22. */
  23. class zipfile
  24. {
  25.     /**
  26.      * Array to store compressed data
  27.      *
  28.      * @var  array    $datasec
  29.      */
  30.     var $datasec      = array();
  31.     /**
  32.      * Central directory
  33.      *
  34.      * @var  array    $ctrl_dir
  35.      */
  36.     var $ctrl_dir     = array();
  37.     /**
  38.      * End of central directory record
  39.      *
  40.      * @var  string   $eof_ctrl_dir
  41.      */
  42.     var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  43.     /**
  44.      * Last offset position
  45.      *
  46.      * @var  integer  $old_offset
  47.      */
  48.     var $old_offset   = 0;
  49.     /**
  50.      * Converts an Unix timestamp to a four byte DOS date and time format (date
  51.      * in high two bytes, time in low two bytes allowing magnitude comparison).
  52.      *
  53.      * @param  integer  the current Unix timestamp
  54.      *
  55.      * @return integer  the current date in a four byte DOS format
  56.      *
  57.      * @access private
  58.      */
  59.     function unix2DosTime($unixtime = 0) {
  60.         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  61.         if ($timearray['year'] < 1980) {
  62.             $timearray['year']    = 1980;
  63.             $timearray['mon']     = 1;
  64.             $timearray['mday']    = 1;
  65.             $timearray['hours']   = 0;
  66.             $timearray['minutes'] = 0;
  67.             $timearray['seconds'] = 0;
  68.         } // end if
  69.         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  70.                 ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  71.     } // end of the 'unix2DosTime()' method
  72.     /**
  73.      * Adds "file" to archive
  74.      *
  75.      * @param  string   file contents
  76.      * @param  string   name of the file in the archive (may contains the path)
  77.      * @param  integer  the current timestamp
  78.      *
  79.      * @access public
  80.      */
  81.     function addFile($data, $name, $time = 0)
  82.     {
  83.         $name     = str_replace('\\', '/', $name);
  84.         $dtime    = dechex($this->unix2DosTime($time));
  85.         $hexdtime = '\x' . $dtime[6] . $dtime[7]
  86.                   . '\x' . $dtime[4] . $dtime[5]
  87.                   . '\x' . $dtime[2] . $dtime[3]
  88.                   . '\x' . $dtime[0] . $dtime[1];
  89.         eval('$hexdtime = "' . $hexdtime . '";');
  90.         $fr   = "\x50\x4b\x03\x04";
  91.         $fr   .= "\x14\x00";            // ver needed to extract
  92.         $fr   .= "\x00\x00";            // gen purpose bit flag
  93.         $fr   .= "\x08\x00";            // compression method
  94.         $fr   .= $hexdtime;             // last mod time and date
  95.         // "local file header" segment
  96.         $unc_len = strlen($data);
  97.         $crc     = crc32($data);
  98.         $zdata   = gzcompress($data);
  99.         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
  100.         $c_len   = strlen($zdata);
  101.         $fr      .= pack('V', $crc);             // crc32
  102.         $fr      .= pack('V', $c_len);           // compressed filesize
  103.         $fr      .= pack('V', $unc_len);         // uncompressed filesize
  104.         $fr      .= pack('v', strlen($name));    // length of filename
  105.         $fr      .= pack('v', 0);                // extra field length
  106.         $fr      .= $name;
  107.         // "file data" segment
  108.         $fr .= $zdata;
  109.         // "data descriptor" segment (optional but necessary if archive is not
  110.         // served as file)
  111.         // nijel(2004-10-19): this seems not to be needed at all and causes
  112.         // problems in some cases (bug #1037737)
  113.         //$fr .= pack('V', $crc);                 // crc32
  114.         //$fr .= pack('V', $c_len);               // compressed filesize
  115.         //$fr .= pack('V', $unc_len);             // uncompressed filesize
  116.         // add this entry to array
  117.         $this -> datasec[] = $fr;
  118.         // now add to central directory record
  119.         $cdrec = "\x50\x4b\x01\x02";
  120.         $cdrec .= "\x00\x00";                // version made by
  121.         $cdrec .= "\x14\x00";                // version needed to extract
  122.         $cdrec .= "\x00\x00";                // gen purpose bit flag
  123.         $cdrec .= "\x08\x00";                // compression method
  124.         $cdrec .= $hexdtime;                 // last mod time & date
  125.         $cdrec .= pack('V', $crc);           // crc32
  126.         $cdrec .= pack('V', $c_len);         // compressed filesize
  127.         $cdrec .= pack('V', $unc_len);       // uncompressed filesize
  128.         $cdrec .= pack('v', strlen($name) ); // length of filename
  129.         $cdrec .= pack('v', 0 );             // extra field length
  130.         $cdrec .= pack('v', 0 );             // file comment length
  131.         $cdrec .= pack('v', 0 );             // disk number start
  132.         $cdrec .= pack('v', 0 );             // internal file attributes
  133.         $cdrec .= pack('V', 32 );            // external file attributes - 'archive' bit set
  134.         $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
  135.         $this -> old_offset += strlen($fr);
  136.         $cdrec .= $name;
  137.         // optional extra field, file comment goes here
  138.         // save to central directory
  139.         $this -> ctrl_dir[] = $cdrec;
  140.     } // end of the 'addFile()' method
  141.     /**
  142.      * Dumps out file
  143.      *
  144.      * @return  string  the zipped file
  145.      *
  146.      * @access public
  147.      */
  148.     function file()
  149.     {
  150.         $data    = implode('', $this -> datasec);
  151.         $ctrldir = implode('', $this -> ctrl_dir);
  152.         return
  153.             $data .
  154.             $ctrldir .
  155.             $this -> eof_ctrl_dir .
  156.             pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
  157.             pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall
  158.             pack('V', strlen($ctrldir)) .           // size of central dir
  159.             pack('V', strlen($data)) .              // offset to start of central dir
  160.             "\x00\x00";                             // .zip file comment length
  161.     } // end of the 'file()' method
  162. } // end of the 'zipfile' class
  163. ?>


 
Si vous avez une idée  :jap:


Message édité par tuxbleu le 04-06-2009 à 18:01:22
Reply

Marsh Posté le 04-06-2009 à 17:59:09   

Reply

Marsh Posté le 04-06-2009 à 23:13:51    

:cry:  :bounce:


Message édité par tuxbleu le 04-06-2009 à 23:16:23
Reply

Marsh Posté le 05-06-2009 à 14:27:09    

J'ai jamais utilisé la fonction zip mais en rentrant ce soir je me pencherais bien sur ton problème si entre temps tu n'as pas trouvé.
A vu de nez il faut tenter le chemin absolu. Pour t'aider tu peux utiliser $_SERVER['DOCUMENT_ROOT'].


Message édité par Berceker United le 05-06-2009 à 14:28:33
Reply

Marsh Posté le 05-06-2009 à 14:29:34    

Peux-tu donner un exemple de ce que tu veux faire, de ce qui se passe, et des explications plus détaillées ? Tu veux que ton archive ne contienne qu'un seul "répertoire" (la racine) avec tous les fichiers de l'arborescence d'origine ?

Reply

Marsh Posté le 07-06-2009 à 13:18:20    

Alors :
Je cherche à zipper le contenu d'un répertoire, tout "bêtement".  
J'ai un répertoire, quelques fichiers dedans, je voudrais juste en faire un zip (je le mail après ce zip, et c'est bien plus facile pour moi d'envoyer un zip que x fichiers, mais le problème n'est pas là).
Et je ne comprends pas pourquoi la fonction zip me crée une arborescence entre l'endroit où je lance le script et le lieu où est mon dossier à zipper :s
berceker united > si j'indique le lieu où est mon répertoire par un chemin absolu, le zip concerve l'arborescence complete (c:\-->\monrepertoire)

Reply

Marsh Posté le 07-06-2009 à 16:30:59    

Bah peut-être parce que tu utilises un code que tu ne comprends pas et qui explicitement fait ce que tu ne veux pas qu'il fasse ?  
 
D'où vient le $i de la ligne 24 de ton premier code ? A quoi sert-il ?  
 
La méthode addFile (ligne 92, deuxième code) reçoit en paramètre le nom du fichier à ajouter dans l'archive. C'est un nom "purement informatif". Ce nom ne sert à rien, si ce n'est à pouvoir identifier le fichier dans l'archive.  
 
Si tu veux n'avoir qu'une partie de l'arborescence dans le nom du fichier, tu dois modifier explicitement ton appel en ligne 27 de ton premier code. Remplacer $path."/".$file par ce que tu souhaites (sans doute un suffixe de $path plus "/".$file).
 
 

Reply

Marsh Posté le 07-06-2009 à 18:34:23    

en effet, je recherchais une fonction de zippage de répertoire, apres avoir pas mal pataugé, j'ai trouvé ca qui semblait fonctionner, j'ai pris.  
Disons que je commençais un peu à saturer de mes deux jours de prog php à patauger sur un envoie de mail, des uploads, et je saturais un peu à lire ce code, les I/O sur un langage sont jamais trivials je trouve, apres à tete reposé, je vais essayer de mieux comprendre.
je vais regarder tes suggestions / interrogations


Message édité par tuxbleu le 07-06-2009 à 18:36:26
Reply

Marsh Posté le 08-06-2009 à 11:12:42    

En effet à tête reposée, c'est plus "évident", et en m'inspirant de ton commentaire :
 
$zip->addFile(file_get_contents($path."/".$file),$path."/".$file);
devient
$zip->addFile(file_get_contents($path."/".$file),$file);
 
Je perds une gestion éventuelle de sous-répertoires, mais dans mon cas c'est impossible, ce ne sont que des fichiers sans arborescence.
Merci :) :jap:

Reply

Marsh Posté le 08-06-2009 à 12:38:39    

Tu peux conserver la gestion des sous-répertoires, il te suffit de ne garder que la partie qui t'intéresse dans $path plutôt que de tout supprimer.

Reply

Marsh Posté le 08-06-2009 à 13:49:12    

heu, je en suis pas sur en fait (et ca reste un peu enigmatique dans mon esprit) : $path, c'est le chemin d'acces à mon répertoire à zipper. Ce chemin ne m'intéresse jamais dans mon zip. A mon avis ca se joue dans l'appel recursif. Je pense que si je veux garder l'arborescence du contenu de ce que zip, il me faudrait un troisieme parametre, genre :  
1-->chemin du rep à zipper, qui restera fixe, meme dans un appel recursssif
2-->chemin depuis de rep à zipper,  
3--> fichier/dossier courant.
 
Bon dans mon cas, je ne me creuse pas, j'ai juste à zipper des fichiers depuis un rep, donc je laisse mon code comme ca, "dépouillé" de gestion de sous répertoire.
 
:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed