Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
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 21/04/2006, 15h21   #1
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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.
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 15h25   #2
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
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
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 15h27   #3
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
Merci pour la remarque.
je vais essayer ca tout de suite et je te tiens au courant!

a toute,

BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 15h35   #4
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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!
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 15h50   #5
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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!
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 16h01   #6
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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
?>
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 16h24   #7
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
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
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 16h53   #8
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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,
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 16h54   #9
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
de rien on est la pour s'entre aider , jespere que tu as résolu ton pb
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 11h39   #10
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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);
?>
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 11h55   #11
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
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);
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 12h05   #12
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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.
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 12h17   #13
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
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.
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 12h25   #14
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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

BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 12h30   #15
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
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).
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 12h51   #16
Invité de passage
 
Inscription : mai 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 11
Points : 0
Points : 0
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
BOUHAMOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h52.


 
 
 
 
Partenaires

Hébergement Web