IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Php Zip et dossier racine


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Php Zip et dossier racine
    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) :
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    <?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 :
    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?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

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    demande à l'auteur de la classe, sinon pourquoi utiliser une classe PHP alors que PHP gère le Zip...
    http://php.net/manual/fr/book.zip.php

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Si j'en crois le code de ta classe, la fonction addfile() ajoute les fichiers dans un dossier central.

    A moins de revoir totalement ta classe et de bien te mettre à apprendre la structure d'un fichier zip en hexa, je te conseille comme le conseille stealth35 d'utiliser la classe native de PHP. Tout hébergeur sérieux l'ont (même en mutualisé), par contre, de mémoire, celle-ci est désactivé sur les serveurs de free.
    Je suis fervent utilisateur de PHP et de jQuery.
    Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur pour envoyer l'URL de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc…

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Bonjour juixo,

    Je pense avoir la solution à ton problème.

    La fonction $zip->addfile() te permet de spécifier le fichier que tu veux ajouter dans ton archive et de le renommer.

    L'espace ou tu le renommes est le second paramètre de cette fonction.

    Ainsi quand tu écris :

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

    Ton fichier ajouté à l'archive se nommera "dossier/fichier1" dans le cas où a = 0.
    La fonction reproduira l'arborescence que tu donnes dans ce second paramètre.

    En revanche, si tu remplaces $filename[$a] par "fichier1", la fonction t'ajoutera ton fichier sans arborescence.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/03/2009, 15h10
  2. [PHP-JS] Include et racine du site
    Par pierre50 dans le forum Langage
    Réponses: 1
    Dernier message: 03/09/2007, 20h56
  3. Réponses: 5
    Dernier message: 02/02/2007, 15h53
  4. Réponses: 1
    Dernier message: 30/12/2006, 11h14
  5. liens hors dossier racine du site
    Par natjoker dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 13/09/2005, 02h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo