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

Bibliothèques et frameworks PHP Discussion :

[Zip] Problème de création d'archives (Zip.lib.php)


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut [Zip] Problème de création d'archives (Zip.lib.php)
    Bonjour,

    Je suis entrain d'écrire un script PHP afin de compresser le contenu d'un dossier sur le serveur.
    concernant l'instanciation de la classe zipfile, j'ai aucun souci, mais dés que j'utilise la méthode addFile() de cette classe pour rajouter les fichiers presents dans mon dossier, j'ai aucun fichier zip de crée.

    et dés que je met en commentaire la méthode addFile(), je génére un fichier zip mais vide! (normal).

    Voici le code de mon script:
    <?php
    require("zip.lib.php");
    set_time_limit (1000);
    $fichier_zip = "test.zip";

    $rep = "dir/"; //le nom de mon dossier
    $path = opendir($rep);

    $zip= new zipfile();
    while ($f = readdir($path)) {
    if(is_file($rep.$f))
    {
    $fp = fopen ($rep.$f, 'r');
    $content = fread($fp,filesize($rep.$f));
    fclose($fp);

    echo "is file ".$f."<br>"; //je verifie la présence des fichiers dans $rep
    $zip->addFile($content,$rep.$f);

    }
    }

    $filezipped=$zip->file();
    $open = fopen($fichier_zip, "w");
    fwrite($open, $filezipped);
    fclose($open);
    ?>

    Je compte sur votre aide précieuse pour me guider car je suis perdu!!
    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pour moi c'est logique qu'il ne te fasse rien.

    $zip->addFile($content,$rep.$f);
    il t'ajoute dans le zip $content et lui donne le nom $rep.$f.
    Or $rep.$f contient des slashes ( $rep = "dir/"; //le nom de mon dossier)
    et tu ne peux pas mettre de slashes dans un nom de fichiers (pas de \ / : * ? < > | je ois en oublier je pense)

    Essai en donnant un autre nom dans le addfile

  3. #3
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Merci pour la remarque.
    je vais essayer ca tout de suite et je te tiens au courant!

    a toute,


  4. #4
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Ta remarque est forcement constructive, mais le probléme reside encore malgré que j'ai changé ma boucle while par la suivante:

    while ($f = readdir($path)) {
    if(is_file($rep.$f))
    {
    $fp = fopen ($rep.$f, 'r');
    $content = fread($fp,filesize($rep.$f));
    fclose($fp);

    echo "is file ".$f."<br>";
    $zip->addFile($content,$f);

    }
    }

    ou $f est le nom du fichier present dans mon repertoire.


    Qu'est ce t'en pense?
    Autres remarques ou suggestion?

    A l'aide!

  5. #5
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Autre question,
    Est ce qu'on est obligé de mettre la classe zip.lib.php sur le serveur ou elle est fournie d'office par phpmyadmin.
    si elle est fournie, on la trouve ou au niveau de la hierarchie du serveur!
    moi en tout cas j'utilise la version PHP Version 4.2.3.

    J'ai téléchargé la class zip.lib.php est je l'ai mise sur mon serveur web!

  6. #6
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut class zip.lib.php utilisée
    pour info, je vous mets la classe zip.lib.php que j'appel:

    <?php
    /* $Id: zip.lib.php,v 1.1 2004/02/14 15:21:18 anoncvs_tusedb Exp $ */
    // vim: expandtab sw=4 ts=4 sts=4:


    /**
    * Zip file creation class.
    * Makes zip files.
    *
    * Last Modification and Extension By :
    *
    * Hasin Hayder
    * HomePage : www.hasinme.info
    * Email : countdraculla@gmail.com
    * IDE : PHP Designer 2005
    *
    *
    * Originally Based on :
    *
    * http://www.zend.com/codex.php?id=535&single=1
    * By Eric Mueller <eric@themepark.com>
    *
    * http://www.zend.com/codex.php?id=470&single=1
    * by Denis125 <webmaster@atlant.ru>
    *
    * a patch from Peter Listiak <mlady@users.sourceforge.net> for last modified
    * date and time of the compressed file
    *
    * Official ZIP file format: http://www.pkware.com/appnote.txt
    *
    * @access public
    */
    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)
    $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


    /**
    * A Wrapper of original addFile Function
    *
    * Created By Hasin Hayder at 29th Jan, 1:29 AM
    *
    * @param array An Array of files with relative/absolute path to be added in Zip File
    *
    * @access public
    */
    function addFiles($files /*Only Pass Array*/)
    {
    foreach($files as $file)
    {
    if (is_file($file)) //directory check
    {
    $data = implode("",file($file));
    $this->addFile($data,$file);
    }
    }
    }

    /**
    * A Wrapper of original file Function
    *
    * Created By Hasin Hayder at 29th Jan, 1:29 AM
    *
    * @param string Output file name
    *
    * @access public
    */
    function output($file)
    {
    $fp=fopen($file,"w");
    fwrite($fp,$this->file());
    fclose($fp);
    }



    } // end of the 'zipfile' class
    ?>

  7. #7
    Invité
    Invité(e)
    Par défaut
    cette classe est utilisé par phpmyadmin pour l'exportation des bdd en zip
    (normalement dans le rep libraries de phpmyadmin)
    Mais rien ne t'empeche de la copier et la mettre sur le serveur

    Moi je l'utilise pour creer des zip à la volée et elle marche trés bien : voila ce que je fais , ça peut t'aider

    $zip = new zipfile(); // création d'un objet 'zipfile'
    if (file_exists($fichier)) // je verifie que le fichier existe
    {
    $fp = fopen ($fichier, 'r');// j'ouvre mon fichier en lecture
    $content = fread($fp, filesize($fichieri));// copie dans content
    fclose ($fp);//fermeture
    $zip->addfile($content, $nom_du_fichier);// ajout au zip avec son nom
    }
    // production de l'archive Zip
    $archive = $zip->file();

    Je pense vraiment pas que le pb vienne de addfile
    Plusierus pistes pour résoudre ton pb:
    1. Si j'en crois ton code, le fichier zip.lib.php, ton fichier avec le code et le reprtoire ou sont contenu les fichiers à ajoter dans le zip sont au même niveau , tu confirmes?

    2.Tu utilises mal le readdir
    -->PAS BIEN
    while ($f = readdir($path)) {
    ...
    }

    -->BIEN
    while (false!== ($f = readdir($path))) {
    ...
    }

    3.Aussi pour etre complet
    readdir va aussi te retourner les dossiers "." et "..", noublie pas de faire la verif pour ne pas en tenir compte

  8. #8
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Je pense vraiment pas que le pb vienne de addfile
    Plusierus pistes pour résoudre ton pb:
    1. Si j'en crois ton code, le fichier zip.lib.php, ton fichier avec le code et le reprtoire ou sont contenu les fichiers à ajoter dans le zip sont au même niveau , tu confirmes? OUI !

    2.Tu utilises mal le readdir -

    Aussi pour etre complet
    readdir va aussi te retourner les dossiers "." et "..", noublie pas de faire la verif pour ne pas en tenir compte -- OK je vais regarder tout ca en rentrant chez moi ce soir car la j'en ai eu ma claque !

    En tout cas merci pour ton aide, c'est vraiment sympa !
    a bientot,

  9. #9
    Invité
    Invité(e)
    Par défaut
    de rien on est la pour s'entre aider , jespere que tu as résolu ton pb

  10. #10
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Re bonjour,

    J'ai verifié tout ce qu'on m'a demandé juska maintenant mais rien a faire, j'ai toujours le meme probleme de creation du zip!

    Revoici mon code :
    <?php
    require("zip.lib.php");
    set_time_limit (2000);
    $fichier_zip = "file.zip"; // nom du fichier zip que l'on veut

    $rep = "dir/";
    $path = opendir($rep); // repertoire que l'on veut zipper


    $zip= new zipfile();
    while (false!== ($f = readdir($path))) {
    if(is_file($rep.$f))
    {
    $fp = fopen ($rep.$f, 'r');
    $content = fread($fp,filesize($rep.$f));
    fclose($fp);

    //echo "is file ".$f."<br>";
    $zip->addFile($content,$f);

    }
    closedir($rep);
    }

    $filezipped=$zip->file(); // On recupere le contenu du zip dans la variable $filezipped
    $open = fopen($fichier_zip, "w"); // On la sauvegarde dans le meme repertoire que les fichiers a zipper


    fwrite($open, $filezipped);
    fclose($open);
    ?>

  11. #11
    Invité
    Invité(e)
    Par défaut
    Comme je te l'ai deja dis tu emploie mal tes fonctions!!!

    je rectifie ton code (tester sur ma machine et fonctionne trés bien)

    les modfis :
    - closedir : closedir() ferme le pointeur qui est path et non pas le repertoire $dir comme tu as mis
    - j'ai sorti ton closedir de ta boucle while , tu fermes ton pointeur à la fin une fois sorti de ta boucle
    -pti conseil : edente ton code c plus lisible

    require("zip.lib.php");
    set_time_limit (2000);
    $fichier_zip = "file.zip"; // nom du fichier zip que l'on veut
    $rep = "dir/";
    $path = opendir($rep); // repertoire que l'on veut zipper

    $zip= new zipfile();
    while (false!== ($f = readdir($path)))
    {
    if(is_file($rep.$f))
    {
    $fp = fopen ($rep.$f, 'r');
    $content = fread($fp,filesize($rep.$f));
    fclose($fp);
    $zip->addFile($content,$f);
    }
    }

    closedir($path);

    $filezipped=$zip->file(); // On recupere le contenu du zip dans la variable $filezipped
    $open = fopen($fichier_zip, "w"); // On la sauvegarde dans le meme repertoire que les fichiers a zipper

    fwrite($open, $filezipped);
    fclose($open);

  12. #12
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Merci pour ton aide encore une fois, c super cool.
    Mais franchement si mon code marche bien sur ta machine, alors il y'a un souci au niveau de la config serveur chez moi car ca marche toujours pas...

    j'ai fais des test en mettant le addFile() en commentaire, j'arrive a acceder au rep "dir/" et j'affiche tout le contenu de ce repretoire ainsi que je crée un fichier zip nommé file.zip mais vide (normal)...

    si j'enleve le commentaire a addFile(), j'affiche le premier fichier du repertoire "dir" et le programme s'arrete au niveau de l'appel de la fonction addFile()
    ... et j'ai pas de fichier zip crée !!!

    Je pense que le probleme ne vient pas du code mais d'autres choses !!

    une idée peut etre? Merci d'avance.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Moi ça marche nikel,
    installe la version easyphp 1.8.0.1 (celle que j'ai) , config par défaut pour voir ce que ça donne.

    Met ton code en ligne pour voir si ça fonctionne ou non.

  14. #14
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    En fait je peux pas installer easyphp...
    car je suis dans mon milieu de travail...
    Tout ce que je peux dire c'est qu'on utilise la version de php 4.2.3

    Si tu veux queje te donne un detail sur le phpinfo() sans probleme...

    je pense qu'il va falloir faire des modifs au niveau de /local/soft/usr/lib/php.ini


  15. #15
    Invité
    Invité(e)
    Par défaut
    dsl mais je ne peux plus t'aider, j'arrive pas à simuler ton erreur.
    question con : as tu assez de place pour stocker ton zip?(c bete mais on sait jamais).

  16. #16
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Par défaut
    Oui j'ai encore assez d'espace pour creer mon zip en plus pour le test que je fais j'essaie deja dans un permier temps de zipper un seul fichier text qui fait meme pas 92 octets...

    Bon, c pas grave, je pense que je vais abandonner l'idée de zipper le contenu de mon repertoire... avec la lib zip.lib.php

    Je sais pas si ya bien d'autres lib open source qui permettent la meme choses... créer des zip ou meme des .tar ?

    Merci kan meme

Discussions similaires

  1. [Prob] Création d'archive zip
    Par hannibal.76 dans le forum Langage
    Réponses: 2
    Dernier message: 19/06/2011, 11h19
  2. [WD15] Problème à la création d'un ZIP
    Par FreeDo dans le forum WinDev
    Réponses: 15
    Dernier message: 10/06/2011, 14h10
  3. Plusieurs problèmes avec copie d'archives zip
    Par mithrendil dans le forum C#
    Réponses: 3
    Dernier message: 27/06/2010, 22h46
  4. [unzip] Problème pour décompresser une archive zip
    Par lammouch dans le forum MATLAB
    Réponses: 11
    Dernier message: 03/04/2008, 17h56
  5. [XML][DOM][ZIP] Problème de lecture dans un zip
    Par gocin dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 04/04/2007, 11h41

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