Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ZIP


Information sur la source

Catégorie :Application Niveau : Initié Date de création : 16/05/2003 Date de mise à jour : 16/05/2003 20:42:28 Vu : 3 642

Note :
9,5 / 10 - par 4 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

C'est les sources pour zipper qui se trouve dans phpmyadmin
 

Source

  • <?
  • class zipfile
  • {
  •     /**
  •      * array to store compressed data
  •      *
  •      * @var array   $datasec
  •      */
  •     var $datasec        = array();
  •     /**
  •      * Central directory
  •      *
  •      * @var array   $ctrl_dir
  •      */
  •     var $ctrl_dir    = array();
  •     /**
  •      * end of central directory record
  •      *
  •      * @var string   $eof_ctrl_dir
  •      */
  •     var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
  •     /**
  •      * Last offset position
  •      *
  •      * @var integer $old_offset
  •      */
  •     var $old_offset  = 0;
  •     /**
  •      * Converts an Unix timestamp to a four byte DOS date and time format (date
  •      * in high two bytes, time in low two bytes allowing magnitude comparison).
  •      *
  •      * @param   integer the current Unix timestamp
  •      *
  •      * @return integer  the current date in a four byte DOS format
  •      *
  •      * @access private
  •      */
  •     function unix2DosTime($unixtime = 0) {
  •         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  •         if (1) {
  •             $timearray['year']  = 2000;
  •             $timearray['mon']    = 1;
  •             $timearray['mday']  = 1;
  •             $timearray['hours']  = 0;
  •             $timearray['minutes'] = 0;
  •             $timearray['seconds'] = 0;
  •         } // end if
  •         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  •                 ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  •     } // end of the 'unix2DosTime()' method
  •     /**
  •      * Adds "file" to archive
  •      *
  •      * @param   string   file contents
  •      * @param   string   name of the file in the archive (may contains the path)
  •      * @param   integer the current timestamp
  •      *
  •      * @access public
  •      */
  •     function addFile($data, $name, $time = 0)
  •     {
  •         $name    = str_replace('\\', '/', $name);
  •         $dtime  = dechex($this->unix2DosTime($time));
  •         $hexdtime = '\x' . $dtime[6] . $dtime[7]
  •                     . '\x' . $dtime[4] . $dtime[5]
  •                     . '\x' . $dtime[2] . $dtime[3]
  •                     . '\x' . $dtime[0] . $dtime[1];
  •         eval('$hexdtime = "' . $hexdtime . '";');
  •         $fr  = "\x50\x4b\x03\x04";
  •         $fr  .= "\x14\x00";         // ver needed to extract
  •         $fr  .= "\x00\x00";         // gen purpose bit flag
  •         $fr  .= "\x08\x00";         // compression method
  •         $fr  .= $hexdtime;           // last mod time and date
  •         // "local file header" segment
  •         $unc_len = strlen($data);
  •         $crc     = crc32($data);
  •         $zdata   = gzcompress($data,0); //Change le 0 pour avoir une compression differente
  •         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
  •         $c_len   = strlen($zdata);
  •         $fr     .= pack('V', $crc);          // crc32
  •         $fr     .= pack('V', $c_len);            // compressed filesize
  •         $fr     .= pack('V', $unc_len);      // uncompressed filesize
  •         $fr     .= pack('v', strlen($name));    // length of filename
  •         $fr     .= pack('v', 0);                // extra field length
  •         $fr     .= $name;
  •         // "file data" segment
  •         $fr .= $zdata;
  •         // "data descriptor" segment (optional but necessary if archive is not
  •         // served as file)
  •         $fr .= pack('V', $crc);              // crc32
  •         $fr .= pack('V', $c_len);                // compressed filesize
  •         $fr .= pack('V', $unc_len);          // uncompressed filesize
  •         // add this entry to array
  •         $this -> datasec[] = $fr;
  •         $new_offset     = strlen(implode('', $this->datasec));
  •         // now add to central directory record
  •         $cdrec = "\x50\x4b\x01\x02";
  •         $cdrec .= "\x00\x00";               // version made by
  •         $cdrec .= "\x14\x00";               // version needed to extract
  •         $cdrec .= "\x00\x00";               // gen purpose bit flag
  •         $cdrec .= "\x08\x00";               // compression method
  •         $cdrec .= $hexdtime;                 // last mod time & date
  •         $cdrec .= pack('V', $crc);           // crc32
  •         $cdrec .= pack('V', $c_len);         // compressed filesize
  •         $cdrec .= pack('V', $unc_len);       // uncompressed filesize
  •         $cdrec .= pack('v', strlen($name) ); // length of filename
  •         $cdrec .= pack('v', 0 );             // extra field length
  •         $cdrec .= pack('v', 0 );             // file comment length
  •         $cdrec .= pack('v', 0 );             // disk number start
  •         $cdrec .= pack('v', 0 );             // internal file attributes
  •         $cdrec .= pack('V', 32 );           // external file attributes - 'archive' bit set
  •         $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
  •         $this -> old_offset = $new_offset;
  •         $cdrec .= $name;
  •         // optional extra field, file comment goes here
  •         // save to central directory
  •         $this -> ctrl_dir[] = $cdrec;
  •     } // end of the 'addFile()' method
  •     /**
  •      * Dumps out file
  •      *
  •      * @return  string  the zipped file
  •      *
  •      * @access public
  •      */
  •     function file()
  •     {
  •     $data   = implode('', $this -> datasec);
  •         $ctrldir = implode('', $this -> ctrl_dir);
  •         return
  •             $data .
  •             $ctrldir .
  •             $this -> eof_ctrl_dir .
  •             pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
  •             pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall
  •             pack('V', strlen($ctrldir)) .            // size of central dir
  •             pack('V', strlen($data)) .              // offset to start of central dir
  •             "\x00\x00";                          // .zip file comment length
  •     } // end of the 'file()' method
  • } // end of the 'zipfile' class
  • $zip=new zipfile();
  • $zip->addFile("Comment va","myfile.txt");
  • $zip->addFile("Comment va","dossier1/myfile.txt");
  • $zip->addFile("Comment va","myfile.txt");
  • header("Content-type: application/x-zip");
  • echo $zip->file();
  • ?>
<?
class zipfile
{
    /**
     * array to store compressed data
     *
     * @var array   $datasec
     */
    var $datasec        = array();

    /**
     * Central directory
     *
     * @var array   $ctrl_dir
     */
    var $ctrl_dir    = array();

    /**
     * end of central directory record
     *
     * @var string   $eof_ctrl_dir
     */
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

    /**
     * Last offset position
     *
     * @var integer $old_offset
     */
    var $old_offset  = 0;


    /**
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two bytes allowing magnitude comparison).
     *
     * @param   integer the current Unix timestamp
     *
     * @return integer  the current date in a four byte DOS format
     *
     * @access private
     */
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

        if (1) {
            $timearray['year']  = 2000;
            $timearray['mon']    = 1;
            $timearray['mday']  = 1;
            $timearray['hours']  = 0;
            $timearray['minutes'] = 0;
            $timearray['seconds'] = 0;
        } // end if

        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    } // end of the 'unix2DosTime()' method


    /**
     * Adds "file" to archive
     *
     * @param   string   file contents
     * @param   string   name of the file in the archive (may contains the path)
     * @param   integer the current timestamp
     *
     * @access public
     */
    function addFile($data, $name, $time = 0)
    {
        $name    = str_replace('\\', '/', $name);

        $dtime  = dechex($this->unix2DosTime($time));
        $hexdtime = '\x' . $dtime[6] . $dtime[7]
                    . '\x' . $dtime[4] . $dtime[5]
                    . '\x' . $dtime[2] . $dtime[3]
                    . '\x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');

        $fr  = "\x50\x4b\x03\x04";
        $fr  .= "\x14\x00";         // ver needed to extract
        $fr  .= "\x00\x00";         // gen purpose bit flag
        $fr  .= "\x08\x00";         // compression method
        $fr  .= $hexdtime;           // last mod time and date

        // "local file header" segment
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data,0); //Change le 0 pour avoir une compression differente
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        $c_len   = strlen($zdata);
        $fr     .= pack('V', $crc);          // crc32
        $fr     .= pack('V', $c_len);            // compressed filesize
        $fr     .= pack('V', $unc_len);      // uncompressed filesize
        $fr     .= pack('v', strlen($name));    // length of filename
        $fr     .= pack('v', 0);                // extra field length
        $fr     .= $name;

        // "file data" segment
        $fr .= $zdata;

        // "data descriptor" segment (optional but necessary if archive is not
        // served as file)
        $fr .= pack('V', $crc);              // crc32
        $fr .= pack('V', $c_len);                // compressed filesize
        $fr .= pack('V', $unc_len);          // uncompressed filesize

        // add this entry to array
        $this -> datasec[] = $fr;
        $new_offset     = strlen(implode('', $this->datasec));


        // now add to central directory record
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";               // version made by
        $cdrec .= "\x14\x00";               // version needed to extract
        $cdrec .= "\x00\x00";               // gen purpose bit flag
        $cdrec .= "\x08\x00";               // compression method
        $cdrec .= $hexdtime;                 // last mod time & date
        $cdrec .= pack('V', $crc);           // crc32
        $cdrec .= pack('V', $c_len);         // compressed filesize
        $cdrec .= pack('V', $unc_len);       // uncompressed filesize
        $cdrec .= pack('v', strlen($name) ); // length of filename
        $cdrec .= pack('v', 0 );             // extra field length
        $cdrec .= pack('v', 0 );             // file comment length
        $cdrec .= pack('v', 0 );             // disk number start
        $cdrec .= pack('v', 0 );             // internal file attributes
        $cdrec .= pack('V', 32 );           // external file attributes - 'archive' bit set

        $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
        $this -> old_offset = $new_offset;

        $cdrec .= $name;

        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir[] = $cdrec;
    } // end of the 'addFile()' method


    /**
     * Dumps out file
     *
     * @return  string  the zipped file
     *
     * @access public
     */
    function file()
    {
    $data   = implode('', $this -> datasec);
        $ctrldir = implode('', $this -> ctrl_dir);

        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
            pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall
            pack('V', strlen($ctrldir)) .            // size of central dir
            pack('V', strlen($data)) .              // offset to start of central dir
            "\x00\x00";                          // .zip file comment length
    } // end of the 'file()' method

} // end of the 'zipfile' class
$zip=new zipfile();
$zip->addFile("Comment va","myfile.txt");
$zip->addFile("Comment va","dossier1/myfile.txt");
$zip->addFile("Comment va","myfile.txt");
header("Content-type: application/x-zip");
echo $zip->file();
?>

Commentaires et avis

signaler à un administrateur
Commentaire de eax le 20/07/2003 12:57:23

euh j'arrive pas à le faire fonctionner il me dit
Call to undefined function: gzcompress()

signaler à un administrateur
Commentaire de Magicking le 20/07/2003 15:14:18

Tu as peut-étre easyphp 6.0 ?
il faut que la librairie zlib soit active dans php sinon gzcompress ne marchera pas

signaler à un administrateur
Commentaire de eax le 20/07/2003 17:44:15

ouais c bon ça marche, j'avais pas activé zlib

signaler à un administrateur
Commentaire de grandvizir le 26/06/2005 15:26:23

Je travaillais ce matin sur "ZIP.LIB.PHP" de phpMyAdmin253 et je viens de tester ton code. Ca m'a permis de terminer la compréhension que j'avais amorcée, mais surtout de faire télécharger des XML sans devoir les enregistrer sur le serveur. Il faut dire qu'en ASP (http://www.aspfr.com/code.aspx?ID=9085), faire afficher du XML dynamique dans un navigateur semble bien plus simple. La parade PHP tenait donc dans la librairie ZLIB. Super sympa... !

signaler à un administrateur
Commentaire de wizard512 le 01/07/2005 16:46:39

10/10

signaler à un administrateur
Commentaire de victorcoasne le 28/11/2005 16:22:50

Bonjour,

Superbe source !
Je voudrais juste savoir comment on fait pour changer le nom du fichier qui va télécharger (ex : fichier.zip) et je met 10/10 !

Merci

signaler à un administrateur
Commentaire de maxroucool le 14/03/2006 19:36:19

Je suis d'accord ac tout le monde, tres bon script, mais comment faire pour renommer le fichier obtenu?

Merci bp!
+++

signaler à un administrateur
Commentaire de maxroucool le 14/03/2006 19:49:17

En fait j'ai trouvé comment faire, pour ceux que ca interesse:

[code]
// Supprimer la ligne 169:
// header("Content-type: application/x-zip");

$fname = "leZip"; //Nom du fichier zip (vous pouvez indiquer un autre repertoire, ex: "dossier/leZip"
$f2=fopen($fname.".zip","w");
fputs($f2,$zip->file());
fclose($f2);

// Vous pouvez ajouter cette ligne si vous voulez que le telechargement de l'archive se lance automatiquement
// header('Location: '.$fname.'.zip');
[/code]

+++

signaler à un administrateur
Commentaire de RockmanX le 27/05/2006 21:21:13

Salut!

Je sais pas pourquoi, l'archive se crée avec les fichiers dedans, mais qd je les décompresse, ils ne sont plus lisibles.
C'est des images jpeg que je compresse (et d'ailleurs elles font toute 40 Ko exactement qd elle sont dans l'archive.
Une idée??

signaler à un administrateur
Commentaire de zeratul67 le 17/03/2007 11:49:54

Salut

Merci pour ce code :)

Pour le header, je propose :
header("Content-type: application/zip");
header('Content-Disposition: attachment; filename="'.$nom.'.zip"');
(avec $nom contenant le nom du zip)
Cela fonctionne bien.

Je propose aussi de supprimer les lignes 46 à 53 qui pour une raison que je ne comprend pas écrasent la date lorsqu'on en propose une.

signaler à un administrateur
Commentaire de PerfectSlayer le 08/04/2007 19:11:31

Bonjour.
Dans le cas de gros zip à créer (backup entier de mon site qui fait apparemment plus de 30Mo vu les fatal errorde php), il y aurait-il moyen d'envoyer en continu le contenu du zip de sorte à vider la mémoire avant qu'elle ne soit remplie ?
Merci d'avance ;)

signaler à un administrateur
Commentaire de BTAJV le 07/05/2007 10:27:15

Salut salut moi je voulai juste savoir un truc
A priori il est impossible de se servir de se script chez free car pas la librairie zlib
Mais est il possible de faire autrement ???

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.