Zip (titre trop court)

1/5 (13 avis)

Snippet vu 5 838 fois - Téléchargée 27 fois

Contenu du snippet

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

Source / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

mak2006
Messages postés
4
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
8 mars 2006
-
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
BTAJV
Messages postés
145
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
17 avril 2008
-
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 ???
PerfectSlayer
Messages postés
30
Date d'inscription
lundi 23 juin 2003
Statut
Membre
Dernière intervention
29 août 2007
-
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 ;)
zeratul67
Messages postés
97
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
11 mai 2008
-
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.
RockmanX
Messages postés
109
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
26 octobre 2007
-
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??

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.