Compresser et lire des fichiers Zip [Micha]
Par Damien, jeudi 29 décembre 2005 à 20:03 :: PHP :: #36 :: rss
1- Introduction
Dans ce tutorial, nous allons voir comment compresser ou lister le contenu d'un fichier ZIP. PHP offre deux méthodes pour exploiter les fichiers compressés, l'une en utilisant la bibliothèque "zip.lib.php" l'autre en utilisant l'extension "php_zip". Nous allons voir ces deux méthodes. Pour ce faire nous utiliserons la première pour la compression et la seconde pour la décompression.
Au préalable installez la bibliothèque "zip.lib.php". Téléchargeable ici. Vous pouvez la mettre dans un dossier de votre site, ainsi qu'activer l'extension "php_zip" sur votre serveur (voir site officiel de PHP), si vous êtes hébergé en mutualisé renseignez vous en faisant exécutant la fonction :
<?php php_info() ; ?>
2- Compresser un ou plusieurs fichiers en ZIP
Le code de base : un seul fichier
Avant toute chose vous devez inclure la librairie :
<?php
require("zip.lib.php") ; //indiquez le chemin d'accès à la librérie
?>
Créer après le fichier Zip. Pour cela, nous allons utiliser la fonction zipfile().
<?php $zip = new zipfile() ; //on crée un fichier zip ?>
Remarque : la fonction zipfile() n'est pas dans le manuel PHP mais elle est défnie dans la libérie.
Ensuite ouvrir le fichier à zipper (se référer au tutoriel sur les fichiers FTP)
<?php $filename = 'test.txt' ; $fp = fopen($filename,'r') ; //on ouvre le fichier en lecture seule $contenu = fread($fp, filesize($filename)) ; //on enregistre le contenu fclose($fp) ; //on ferme FTP ?>
Puis on ajoute le fichier text.txt à l'archive. Pour cela on utilise la fonction addfile().
<?php $zip->addfile($contenu, $filename) ; //on ajoute le fichier ?>
On associe le fichier Zip, on utilise pour ça la simple fonction file().
<?php $archive = $zip->file() ; //on associe l'archive ?>
On ajoute les en-têtes, fonction header().
<?php
header('Content-Type: application/x-zip') ; //on détermine les en-tête
header('Content-Disposition: inline; filename=archive.zip') ;
?>
Enfin on envoi le tout au navigateur. Fonction echo().
Et voilà ce que cela donne :
<?php
require("zip.lib.php") ; //indiquez le chemin d'accès à la librérie
$zip = new zipfile() ; //on crée un fichier zip
$filename = 'test.txt' ;
$fp = fopen($filename,'r') ; //on ouvre le fichier en lecture seule
$contenu = fread($fp, filesize($filename)) ; //on enregistre le contenu
fclose($fp) ; //on ferme FTP
$zip->addfile($contenu, $filename) ; //on ajoute le fichier
$archive = $zip->file() ; //on associe l'archive
header('Content-Type: application/x-zip') ; //on détermine les en-tête
header('Content-Disposition: inline; filename=archive.zip') ;
echo $archive ;
?>
Avec plusieurs fichiers
Pas tellement plus compliqué ! On ne fait qu'ajouter une boucle avec while et le tour est joué.
On stoque tout les noms de fichiers à ajouter à l'archive dans le tableau filename.
<?php
$filename = array('test1.txt','test2.txt','test3.txt') ;
?>
On crée une boucle
<?php
$a = 0 ;
while(count($filename)>$a)
{
$fp = fopen($filename[$a],'r') ; //on ouvre le fichier en lecture seule
$contenu = fread($fp, filesize($filename[$a])) ; //on enregistre le contenu
fclose($fp) ; //on ferme FTP
$zip->addfile($contenu, $filename[$a]) ; //on ajoute le fichier
$a++; //on incrémente $a
}
?>
Puis tout le reste est le même que pour un seul fichier. On obtient alors :
<?php
require("zip.lib.php") ; //indiquez le chemin d'accès à la librérie
$zip = new zipfile() ; //on crée un fichier zip
$filename = array('test1.txt','test2.txt','test3.txt') ;
$a = 0 ;
while(count($filename)>$a)
{
$fp = fopen($filename[$a],'r') ; //on ouvre le fichier en lecture seule
$contenu = fread($fp, filesize($filename[$a])) ; //on enregistre le contenu
fclose($fp) ; //on ferme FTP
$zip->addfile($contenu, $filename[$a]) ; //on ajoute le fichier
$a++; //on incrémente $a
}
$archive = $zip->file() ; //on associe l'archive
header('Content-Type: application/x-zip') ; //on détermine les en-tête
header('Content-Disposition: inline; filename=archive.zip') ;
echo $archive ;
?>
Remarque : si le chemin d'accès vers un des fichiers inclus dans l'archive est erroné, l'archive contiendra un fichier de son nom mais vide : poids = 0 octets.
3- Lire le contenu d'un fichier ZIP
Pour lister les différents fichiers d'un document ZIP, nous allons utiliser la méthode qui nécessite l'activation de l'extension "php_zip".
Ouvrons le fichier zip :
<?php
$zip = zip_open("/tmp/test.zip");
?>
Attention ! entrer le chemin total !
On vérifie que le fichier est correctement ouvert :
<?php
if ($zip) {
}
?>
On crée une boucle qui tourne jusqu'a épuisement des fichiers :
<?php
while ($zip_entry = zip_read($zip)) {
}
?>
Et enfin on affiche toutes les données relatives au fichier :
<?php echo "Nom : " . zip_entry_name($zip_entry) . "<br>";
echo "Poids actuel : " . zip_entry_filesize($zip_entry) . "<br>";
echo "Poids compressé: " . zip_entry_compressedsize($zip_entry) . "<br>";
echo "Méthode de compression : " . zip_entry_compressionmethod($zip_entry) . "<br>"; ?>
Cela nous donne :
<?php
$zip = zip_open("/tmp/test.zip");
if ($zip) {
while($zip_entry = zip_read($zip)) {
echo "Nom : " . zip_entry_name($zip_entry) . "<br>";
echo "Poids actuel : " . zip_entry_filesize($zip_entry) . "<br>";
echo "Poids compressé: " . zip_entry_compressedsize($zip_entry) . "<br>";
echo "Méthode de compression : " . zip_entry_compressionmethod($zip_entry) . "<br>";
}
}
?>
Tutorial écrit par Micha Mazaheri.

Commentaires
1. Le vendredi 30 décembre 2005 à 12:32, par Raphaël Wils
2. Le dimanche 1 janvier 2006 à 18:22, par tk5ep
3. Le samedi 25 mars 2006 à 18:03, par Big_ben3333
4. Le lundi 17 avril 2006 à 12:29, par zero
5. Le mercredi 19 avril 2006 à 10:39, par Ornite
6. Le lundi 24 avril 2006 à 16:35, par Informatika
7. Le mardi 2 mai 2006 à 14:41, par Pateysoft
8. Le samedi 13 mai 2006 à 17:06, par max00
9. Le jeudi 29 juin 2006 à 14:24, par kainoak
10. Le vendredi 30 juin 2006 à 11:51, par jerrykan
11. Le vendredi 30 juin 2006 à 14:40, par ragondin
12. Le mardi 4 juillet 2006 à 11:36, par zero
13. Le mercredi 12 juillet 2006 à 15:54, par plumpy
14. Le mercredi 19 juillet 2006 à 17:32, par Lola
15. Le mardi 25 juillet 2006 à 02:06, par david guez
16. Le mardi 25 juillet 2006 à 15:33, par ragondin
17. Le mardi 25 juillet 2006 à 18:03, par saojin
18. Le mardi 25 juillet 2006 à 20:08, par david guez
19. Le vendredi 28 juillet 2006 à 11:58, par ragondin
20. Le vendredi 28 juillet 2006 à 12:03, par ragondin
21. Le dimanche 30 juillet 2006 à 23:49, par david guez
22. Le dimanche 13 août 2006 à 01:31, par david guez
23. Le lundi 28 août 2006 à 16:16, par cruzard
24. Le vendredi 1 septembre 2006 à 17:13, par SiryuS
25. Le jeudi 7 septembre 2006 à 11:54, par david guez
26. Le vendredi 8 septembre 2006 à 14:49, par Cube
27. Le mardi 12 septembre 2006 à 16:42, par david guez
28. Le vendredi 29 septembre 2006 à 11:47, par Pascale
29. Le mardi 5 juin 2007 à 23:53, par ikerc
30. Le jeudi 7 juin 2007 à 14:10, par bada
31. Le jeudi 26 juillet 2007 à 00:35, par visiteur
32. Le vendredi 27 juillet 2007 à 02:03, par fbsi
33. Le dimanche 11 novembre 2007 à 14:00, par Christian
34. Le lundi 3 mars 2008 à 09:44, par pav
35. Le jeudi 13 mars 2008 à 11:27, par hello-celine
36. Le jeudi 22 mai 2008 à 10:48, par Johan
37. Le vendredi 26 septembre 2008 à 09:48, par ssm2017
38. Le mardi 11 novembre 2008 à 18:15, par courgette75
39. Le mardi 11 novembre 2008 à 18:19, par courgette75
40. Le mardi 7 avril 2009 à 10:25, par johndbc
41. Le mardi 28 avril 2009 à 19:42, par xtof054
42. Le jeudi 6 août 2009 à 18:39, par zebulon
43. Le jeudi 27 août 2009 à 15:16, par winux
44. Le mercredi 6 janvier 2010 à 16:53, par Djedje
45. Le mardi 16 mars 2010 à 12:01, par maks
Ajouter un commentaire