Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
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 07/03/2011, 19h25   #1
Futur Membre du Club
 
Inscription : mai 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 50
Points : 18
Points : 18
Par défaut Problème création zip avec PHP

Bonjour à tous,

Après avoir pas mal cherché, j'ai trouvé une class qui marche pour créer une archive zip avec PHP. Cependant un dernier problème me bloque. C'est surement tout bête pour certains d'entre vous mais je bloque...

J'utilise une classe trouvée sur internet que voici:

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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
<?php
/**
 * Class to dynamically create a zip file (archive) of file(s) and/or directory
 *
 * @author Rochak Chauhan  www.rochakchauhan.com
 * @package CreateZipFile
 * @see Distributed under "General Public License"
 * 
 * @version 1.0
 */
 
class CreateZipFile {
 
	public $compressedData = array();
	public $centralDirectory = array(); // central directory
	public $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
	public $oldOffset = 0;
 
	/**
	 * Function to create the directory where the file(s) will be unzipped
	 *
	 * @param string $directoryName
	 * @access public
	 * @return void
	 */	
	public function addDirectory($directoryName) {
		$directoryName = str_replace("\\", "/", $directoryName);
		$feedArrayRow = "\x50\x4b\x03\x04";
		$feedArrayRow .= "\x0a\x00";
		$feedArrayRow .= "\x00\x00";
		$feedArrayRow .= "\x00\x00";
		$feedArrayRow .= "\x00\x00\x00\x00";
		$feedArrayRow .= pack("V",0);
		$feedArrayRow .= pack("V",0);
		$feedArrayRow .= pack("V",0);
		$feedArrayRow .= pack("v", strlen($directoryName) );
		$feedArrayRow .= pack("v", 0 );
		$feedArrayRow .= $directoryName;
		$feedArrayRow .= pack("V",0);
		$feedArrayRow .= pack("V",0);
		$feedArrayRow .= pack("V",0);
		$this->compressedData[] = $feedArrayRow;
		$newOffset = strlen(implode("", $this->compressedData));
		$addCentralRecord = "\x50\x4b\x01\x02";
		$addCentralRecord .="\x00\x00";
		$addCentralRecord .="\x0a\x00";
		$addCentralRecord .="\x00\x00";
		$addCentralRecord .="\x00\x00";
		$addCentralRecord .="\x00\x00\x00\x00";
		$addCentralRecord .= pack("V",0);
		$addCentralRecord .= pack("V",0);
		$addCentralRecord .= pack("V",0);
		$addCentralRecord .= pack("v", strlen($directoryName) );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("V", 16 );
		$addCentralRecord .= pack("V", $this->oldOffset );
		$this->oldOffset = $newOffset;
		$addCentralRecord .= $directoryName;
		$this->centralDirectory[] = $addCentralRecord;
	}
 
	/**
	 * Function to add file(s) to the specified directory in the archive 
	 *
	 * @param string $directoryName
	 * @param string $data
	 * @return void
	 * @access public
	 */	
	public function addFile($data, $directoryName)   {
		$directoryName = str_replace("\\", "/", $directoryName);
		$feedArrayRow = "\x50\x4b\x03\x04";
		$feedArrayRow .= "\x14\x00";
		$feedArrayRow .= "\x00\x00";
		$feedArrayRow .= "\x08\x00";
		$feedArrayRow .= "\x00\x00\x00\x00";
		$uncompressedLength = strlen($data);
		$compression = crc32($data);
		$gzCompressedData = gzcompress($data);
		$gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2);
		$compressedLength = strlen($gzCompressedData);
		$feedArrayRow .= pack("V",$compression);
		$feedArrayRow .= pack("V",$compressedLength);
		$feedArrayRow .= pack("V",$uncompressedLength);
		$feedArrayRow .= pack("v", strlen($directoryName) );
		$feedArrayRow .= pack("v", 0 );
		$feedArrayRow .= $directoryName;
		$feedArrayRow .= $gzCompressedData;
		$feedArrayRow .= pack("V",$compression);
		$feedArrayRow .= pack("V",$compressedLength);
		$feedArrayRow .= pack("V",$uncompressedLength);
		$this->compressedData[] = $feedArrayRow;
		$newOffset = strlen(implode("", $this->compressedData));
		$addCentralRecord = "\x50\x4b\x01\x02";
		$addCentralRecord .="\x00\x00";
		$addCentralRecord .="\x14\x00";
		$addCentralRecord .="\x00\x00";
		$addCentralRecord .="\x08\x00";
		$addCentralRecord .="\x00\x00\x00\x00";
		$addCentralRecord .= pack("V",$compression);
		$addCentralRecord .= pack("V",$compressedLength);
		$addCentralRecord .= pack("V",$uncompressedLength);
		$addCentralRecord .= pack("v", strlen($directoryName) );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("v", 0 );
		$addCentralRecord .= pack("V", 32 );
		$addCentralRecord .= pack("V", $this->oldOffset );
		$this->oldOffset = $newOffset;
		$addCentralRecord .= $directoryName;
		$this->centralDirectory[] = $addCentralRecord;
	}
 
	/**
	 * Function to return the zip file
	 *
	 * @return zipfile (archive)
	 * @access public
	 * @return void
	 */
	public function getZippedfile() {
		$data = implode("", $this->compressedData);
		$controlDirectory = implode("", $this->centralDirectory);
		return
		$data.
		$controlDirectory.
		$this->endOfCentralDirectory.
		pack("v", sizeof($this->centralDirectory)).
		pack("v", sizeof($this->centralDirectory)).
		pack("V", strlen($controlDirectory)).
		pack("V", strlen($data)).
		"\x00\x00";
	}
 
	/**
	 *
	 * Function to force the download of the archive as soon as it is created
	 *
	 * @param archiveName string - name of the created archive file
	 * @access public
	 * @return ZipFile via Header
	 */
	public function forceDownload($archiveName) {
		if(ini_get('zlib.output_compression')) {
			ini_set('zlib.output_compression', 'Off');
		}
 
		// Security checks
		if( $archiveName == "" ) {
			echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>";
			exit;
		}
		elseif ( ! file_exists( $archiveName ) ) {
			echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</body></html>";
			exit;
		}
 
		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Cache-Control: private",false);
		header("Content-Type: application/zip");
		header("Content-Disposition: attachment; filename=".basename($archiveName).";" );
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: ".filesize($archiveName));
		readfile("$archiveName");
	}
 
	/**
	  * Function to parse a directory to return all its files and sub directories as array
	  *
	  * @param string $dir
	  * @access protected 
	  * @return array
	  */
	protected function parseDirectory($rootPath, $seperator="/"){
		$fileArray=array();
		$handle = opendir($rootPath);
		while( ($file = @readdir($handle))!==false) {
			if($file !='.' && $file !='..'){
				if (is_dir($rootPath.$seperator.$file)){
					$array=$this->parseDirectory($rootPath.$seperator.$file);
					$fileArray=array_merge($array,$fileArray);
				}
				else {
					$fileArray[]=$rootPath.$seperator.$file;
				}
			}
		}		
		return $fileArray;
	}
 
	/**
	 * Function to Zip entire directory with all its files and subdirectories 
	 *
	 * @param string $dirName
	 * @access public
	 * @return void
	 */
	public function zipDirectory($dirName, $outputDir) {
		if (!is_dir($dirName)){
			trigger_error("CreateZipFile FATAL ERROR: Could not locate the specified directory $dirName", E_USER_ERROR);
		}
		$tmp=$this->parseDirectory($dirName);
		$count=count($tmp);
		$this->addDirectory($outputDir);
		for ($i=0;$i<$count;$i++){
			$fileToZip=trim($tmp[$i]);
			$newOutputDir=substr($fileToZip,0,(strrpos($fileToZip,'/')+1));
			$outputDir=$outputDir.$newOutputDir;
			$fileContents=file_get_contents($fileToZip);
			$this->addFile($fileContents,$fileToZip);
		}
	}
}
?>
Je l'utilise via le code suivant que j'ai légèrement modifié:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$fileToZip = 'tmp/Annonces.csv';
$fileToZip1 = '/tmp/Config.txt';
$fileToZip2 = '/tmp/Photos.cfg';
 
$directoryToZip = 'tmp';
$outputDir = '../../files/';
$zipName = 'RURALE.zip';
$zipName = $outputDir.$zipName;
 
include_once('../../inc/CreateZipFile.inc.php');
$createZipFile = new CreateZipFile;
 
$createZipFile->zipDirectory($directoryToZip,$outputDir);
 
//$rand=md5(microtime().rand(0,999999));
//$zipName=$rand."_".$zipName;
$fd=fopen($zipName, "wb");
$out=fwrite($fd,$createZipFile->getZippedfile());
fclose($fd);
//$createZipFile->getZippedfile($zipName);
//@unlink($zipName);
?>
La création de l'archive fonctionne très bien, mais je me trouve avec une archive contenant deux dossiers: ../../files et tmp/ alors que j'essaye de compresser uniquement les 3 fichiers ($filetoZip) contenus dans le dossier tmp. Je souhaite donc avoir ces 3 fichiers à la racine de l'archive, sans "sous fichier". Voyez vous comment c'est réalisable ?

Merci à tous,
Julien
julien731 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 08h52   #2
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

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

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Pourquoi ne pas simplement utiliser zipArchive fournit avec php ?

Code :
1
2
3
4
5
6
7
8
9
10
11
 
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->addFile('/path/to/index.txt', 'newname.txt');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 09h58   #3
Futur Membre du Club
 
Inscription : mai 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 50
Points : 18
Points : 18
Lorsque j'utilise cette fonction, en appelant préalablement la librairie zip

Code :
require( "/usr/bin/zip" ) ;
J'obtiens toujours la même erreur:

Code :
1
2
3
Warning: Unexpected character in input: '' (ASCII=21) state=1 in /usr/bin/zip on line 140
 
Parse error: syntax error, unexpected '*' in /usr/bin/zip on line 140
C'est la raison pour laquelle je me suis orienté vers la classe dont je parle plus haut. Je ne sais pas d'où vient cette erreur.
julien731 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 10h23   #4
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Je l'ai utulisé sans le require_one est ça marche et je crois que php par defaut prend en charge la classe zipArchive

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
 
class create_zip extends ZipArchive
{
	public function create_zip($files = array(),$destination = '',$overwrite = false) 
	{
		if(file_exists($destination) && !$overwrite) return false;
 
		$valid_files = array();
		$i = 0;
		if(is_array($files)) 
		{
			foreach($files as $key => $file) 
			{
				if(file_exists($file)) 
				{
					$valid_files[$key] = $file;
				}
			}
		}	
 
		if(count($valid_files)) 
		{
 
			if($this->open($destination,$overwrite ? parent::OVERWRITE : parent::CREATE) !== true) 
			{
				return false;
			}
 
			foreach($valid_files as $key => $file) 
			{
				$this->addFile($file, $key);
			}
 
			$this->close();
			return file_exists($destination);
		}
		else
		{
			return false;
		}
	}
}
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 10h24   #5
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

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

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Citation:
Lorsque j'utilise cette fonction, en appelant préalablement la librairie zip
Pourquoi inclure une librairie système dans ton script php ?
ZipArchive ce suffit à lui même, rien besoin d'autre.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 10h46   #6
Futur Membre du Club
 
Inscription : mai 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 50
Points : 18
Points : 18
Malheureusement, si je n'exécute que ton script grunk, en remplaçant les noms de fichiers et leurs chemins par les miens, j'obtiens un "failed"...
julien731 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 11h25   #7
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

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

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Récupère le retour de ZipArchive::open et compare le avec les valeurs de retour fournie dans la doc : http://fr.php.net/manual/en/function...chive-open.php

Ca devrait te donner une idée de l'erreur rencontrée

Citation:
ZIPARCHIVE::ER_EXISTS - 10
ZIPARCHIVE::ER_INCONS - 21
ZIPARCHIVE::ER_INVAL - 18
ZIPARCHIVE::ER_MEMORY - 14
ZIPARCHIVE::ER_NOENT - 9
ZIPARCHIVE::ER_NOZIP - 19
ZIPARCHIVE::ER_OPEN - 11
ZIPARCHIVE::ER_READ - 5
ZIPARCHIVE::ER_SEEK - 4
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 11h33   #8
Futur Membre du Club
 
Inscription : mai 2010
Messages : 50
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 50
Points : 18
Points : 18
Tu ne peux bien sur pas le voir grunk, mais un grand sourire envahit mon visage !! Je viens de changer

Code :
$zip->open('../../files/RURALE.zip')
pour

Code :
$zip->open('../../files/RURALE.zip', ZipArchive::CREATE)
et tout marche à merveille ! Merci beaucoup pour cette aide précieuse !
julien731 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 18h17   #9
Membre habitué
 
Avatar de a028762
 
Inscription : décembre 2003
Messages : 222
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 222
Points : 108
Points : 108
Je pensais récupérer un bout de script qui marche ,
pour me permettre d'abandonner PCLZIP pour ZIPARCHIVE
Hélas, pas vu le souci
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
 
define (br,"<br />");
define (DirTemporaire,"/media/boulot/temporaire");
$Archive    = DirTemporaire."/dossier.zip";
$UnZip        = new ZipArchive();
$Etat        = $UnZip->open($Archive,ZipArchive::CREATE);
if (!$Etat) {
    echo "Erreur d'ouverture de ".$Archive.br;
} else {
    $Ressource = opendir(DirTemporaire);
    while(false !== ($Fichier = readdir($Ressource))) {
        if ($Fichier <> "." and $Fichier <> "..") {
            $Infos = pathinfo($Fichier);
            $Extension = $Infos['extension'];
            if ($Extension <> "zip") {
                $Etat = $UnZip->addFile(DirTemporaire.$Fichier,$Fichier);
                if (!$Etat) {
                    echo "Erreur d'archivage de ".$Fichier.br;
                } else {
                    echo "Fichier :".$Fichier." zippé ".br;
                }
            }
        }
    }
    $Etat = $UnZip->close();
    if (!$Etat) {
        echo "Erreur de fermeture de ".$Archive." , Etat:".intval($Etat)."!".br;
    } else {
        echo "Fermeture du fichier ZIP créé".br;
    }
}
a028762 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h12.


 
 
 
 
Partenaires

Hébergement Web