begin process at 2012 05 27 21:00:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > ZIP

ZIP


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Application Niveau :Initié Date de création :16/05/2003 Date de mise à jour :16/05/2003 20:42:28 Vu :4 690

Auteur : Magicking

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
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();
?>



 Sources du même auteur

Source avec Zip BNC & SERVEUR WEB CLASS/PHP5
CLASS POUR LES TEMPLATES
SQLBUILDER POUR LES MYSQL_QUERY FACILE(LOL)
Source avec Zip PHPMYEXPLORER(ZIP,TELECHARGEMENT,REPRISE... (MAJ)
IP DANS UN CARDE COLORISEZ

 Sources de la même categorie

Source avec une capture PHPREPOGENERATOR + REPO (WIN) par alvinp
Source avec Zip IPHONE - ICÔNE D'APPEL TÉLÉPHONIQUE SUR L'ÉCRAN D'ACCUEIL par Rainbow
Source avec Zip Source avec une capture [APP WEB]SERVEUREXPLOREUR par thematrix01
Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme

Commentaires et avis

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

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

Commentaire de eax le 20/07/2003 17:44:15

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

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... !

Commentaire de wizard512 le 01/07/2005 16:46:39

10/10

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

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!
+++

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]

+++

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??

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.

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

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 ???

Commentaire de mak2006 le 13/04/2009 17:01:37

bonjour

j'utilise easyphp 1.6

comment je peut activer la biblio zlib

le message d'erreur est le suivant

call to undefined fnction gzcompress()
merci d'avance

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales