PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : Forum Général PHP » Php Zip et dossier racine » 12-07-2011 14:08:51

Mon but étant de zipper en racine tel quel mais visiblement ça ne fonctionne pas.

Je vais tester du côté de ZipArchive ...

Si certains ont une idée je prends.

Bonne soirée

#2 Re : Forum Général PHP » Php Zip et dossier racine » 12-07-2011 14:08:51

mcAllan a écrit :

Salut,

Je ne voie pas trop de solution, il me semble que c'est le fonctionnement normal de l'archivage ZIP...
Si tu fait l'extraction de l'archive en PHP, tu peux coder le fonctionnement attendu.

A+

C'est à dire l'extraction de l'archive ?

Mon but final n'est pas d'arriver à un zip initialement mais à un .xpi d'où pourquoi mes fichiers doivent être à la racine car c'est une extension firefox que je souhaite faire et si le fichier install n'est pas à la racine ça ne fonctionne pas.

A te lire

#3 Forum Général PHP » Php Zip et dossier racine » 12-07-2011 14:08:51

loydbrien
Réponses : 5

Bonjour à tous,

Je me permets de poster ici car après avoir décortiqué toutes les possibilités de mon code, je bloque sur un point.

Il s'agit au juste d'une fonction pour zipper, elle fonctionne à merveille ce n'est pas le soucis, elle compresse même plusieurs dossiers et fichiers ensemble.

Là où est mon soucis c'est que lorsque je lance le script et qu'il compresse, il créer un dossier général au lieu de me zipper tous mes dossiers et fichiers à la racine tels quels.

Ce que je veux c'est que lorsque je décompresse mon .zip, l'extraction soit de tous les fichiers et non d'un dossier général qui les regroupe tous qui a été créé lors de la compression.

Voici la classe pour zipper (zip.lib.php) :

<?php
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 ($timearray['year'] < 1980) {
            $timearray['year']    = 1980;
            $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);
        $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)
        // nijel(2004-10-19): this seems not to be needed at all and causes
        // problems in some cases (bug #1037737)
        //$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;

        // 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 += strlen($fr);

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

Et donc voici la partie à exécuter :

<?php
require('zip.lib.php');

$zip = new zipfile();

$filename = array('dossier/fichier1','dossier/fichier2','dossier/fichier3');

$a = 0;
while(count($filename)>$a)
{
$fp = fopen($filename[$a],'r');
$contenu = fread($fp, filesize($filename[$a]));

fclose($fp);

$zip->addfile($contenu, $filename[$a]);
$a++;
}

$archive = $zip->file();

header('Content-Type: application/x-zip');
header('Content-Disposition: inline; filename=archive.zip');

echo $archive;
?>

Donc dans ce cas par exemple il va m'appeler l'archive archive.zip par de soucis mais lorsque je la décompresse, je n'ai pas mes fichiers immédiatement mais d'abord un dossier principal qui s'appellera soit archive soit le nom du dossier maitre compressé.

Si quelqu'un à la solution pour que ça compresse tel quel sans dossier principal, merci d'avance car j'ai eu beau chercher, je crois qu'en fin de journée je ne vois plus rien.

Merci encore d'avance.

Loyd

Pied de page des forums

Propulsé par FluxBB