Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/03/2011, 17h58   #1
Invité de passage
 
Inscription : mars 2009
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 3
Points : 0
Points : 0
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 :
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 :
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
juixo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h39   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 102
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 102
Points : 8 465
Points : 8 465
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
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 11h08   #3
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
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.
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 19h32   #4
Invité de passage
 
Homme Alexandre
Étudiant
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Alexandre
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 4
Points : 4
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.
Centh est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h07.


 
 
 
 
Partenaires

Hébergement Web