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 :

Problème création zip avec PHP


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 50
    Points : 37
    Points
    37
    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 : 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
    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 : 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
    <?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

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    Pourquoi ne pas simplement utiliser zipArchive fournit avec php ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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';
    }
    ?>

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Lorsque j'utilise cette fonction, en appelant préalablement la librairie zip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require( "/usr/bin/zip" ) ;
    J'obtiens toujours la même erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    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 : 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
     
    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;
    		}
    	}
    }

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    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.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    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"...

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    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

    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    Tu ne peux bien sur pas le voir grunk, mais un grand sourire envahit mon visage !! Je viens de changer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $zip->open('../../files/RURALE.zip')
    pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $zip->open('../../files/RURALE.zip', ZipArchive::CREATE)
    et tout marche à merveille ! Merci beaucoup pour cette aide précieuse !

  9. #9
    Membre confirmé Avatar de a028762
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 419
    Points : 537
    Points
    537
    Par défaut
    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 : 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
     
    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;
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème création ZIP avec DotNetZip
    Par Lenn0x dans le forum ASP.NET
    Réponses: 5
    Dernier message: 17/11/2010, 20h58
  2. Réponses: 6
    Dernier message: 12/06/2006, 16h38
  3. [MySQL] Problème d'apostrophe avec PHP
    Par gcooo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/04/2006, 14h08
  4. [LDAP] problème connexion anonyme avec php à Active Directory
    Par anto48_4 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 02/03/2006, 16h50
  5. [PHP-JS] problème de javascript avec php
    Par ph_anrys dans le forum Langage
    Réponses: 9
    Dernier message: 02/03/2006, 10h34

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