@codenerd på twitter Mit seneste tweet:

Sådan håndterer du ZIP i PHP (5.x)

En af de ting som er rigtigt lækkert ved PHP, og især PHP5, er håndteringen af zip filer. Siden PHP 4.xx (ca :D) har det været muligt at håndtere Zip filer i PHP, men i version 5.2 ombyggede man denne til at fungere langt bedre. For at kunne bruge disse funktioner skal ZIP være aktiveret i PHP (echo phpinfo() for at se om dette er tilfælde).

Som de fleste andre indlæg her på bloggen, udspringer dette af et spørgsmål pr mail. Derfor er det heller ikke en udtømmende gennemgang af håndteringen af ZIP filer i PHP, men kun en gennemgang af de 3 mest almindelige funktioner: Vis indhold af Zip, Pak filer til Zip og udpak filer.

Vis indholdet af Zip fil

Ønsker du fx. at give en oversigt over indholdet af en Zip fil kan dette gøres på følgende måde:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
#læs indhold af zip filer
$filnavn='dinzipfil.zip';//navn på zipfil
$zip = new ZipArchive();//opret et ny zip objekt
if ($zip->open($filnavn) === TRUE) { //hvis filen kan åbnes
for ($i=0; $i<$zip->numFiles;$i++){ //gennemløb arkivet
$fil = $zip->statIndex($i); //hent info for den pågældende fil i arkivet
echo $fil['name'] .'('.$fil['size'].')<br>'; //udskriv info
}
}
$zip->close(); //luk zip objektet
?>

Koden er som sådan ikke videre avanceret. Hver gang vi skal arbejde med en Zip fil skal vi først og fremmest oprette en instans af Zip objektet, dette gøres med $var= new ZipArchive();
Herefter kalder vi funktion open(filnavn) på zip objektet, denne vil returnerer true hvis det lykkedes at åbne zip filen. Herefter kan vi gennemløbe zip filen, her vha. en for løkke. For at finde antallet af elementer i zippen kalder vi metoden numFiles. Informationen om de enkelte elementer henter vi ud ved at kalde statIndex(index) på Zip objektet.

Pak en stak filer

Ønsker vi at pakke filer “on-the-fly” er det ikke meget mere besværligt end at vise indholdet af en Zip fil:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$filnavn='minnyezip.zip'; //filnavnet på den nye zip
$zip = new ZipArchive(); //nyt zip objekt
if ($zip->open($filnavn, ZIPARCHIVE::CREATE) === TRUE) { //hvis zipfilen kunne oprettes
$zip->addFile('fil1.txt'); //tilføj fil1.txt
$zip->addFile('fil2.php'); //tilføj fil2.php
$zip->addFile('fil3.avi'); //tilføj fil3.avi
echo 'Zip filen er klar';
} else{
echo 'Kunne oprette zip filen';
}
$zip->close(); //luk objektet
?>

Igen kalder vi open() men vi sender parameteren ZIPARCHIVE::CREATE med, som fortæller at filen skal oprettes. Herefter tilføjer vi filer med addFile(‘sti/til/fil’);

Udpakning af filer

Dette er faktisk en af de letteste funktioner, når vi har åbnet zip filen med open(fil) kalder vi simpelthen extractTo(udpakningssti), hvorefter PHP klarer resten:

PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
$filnavn='zipfil.zip';
$zip = new ZipArchive(); //nyt zip objekt
if ($zip->open($filnavn) === TRUE) { //hvis zip filen test kunne åbnes
$zip->extractTo('./'); //udpak til samme mappe
echo 'Filerne er pakket ud';
} else {
echo 'der opstod en fejl';
}
$zip->close(); //luk zip objektet
?>

Afslutning

Der er utroligt mange anvendelsesmuligheder for disse funktioner, og der er endnu flere muligheder hvis man sætter sig ind i den fulde funktionalitet. Så hvis du har fået blod på tanden kan jeg kun anbefale at sætte et par timer af til følgende ressourcer:

4 kommentarer

  1. Fedt indlæg Martin.
    Har ikke selv prøvet at lege med PHP og Zip-filer på en gang, men ud fra din lille gennemgang her, kan man da helt sikkert godt prøve at lege lidt med det.
    Lyder spændende :)

    Thank you…! 😀

    Svar på kommentaren
  2. Skrevet af Martin  d. 16/05/2008 kl 07:16

    Heller ikke fordi det er noget jeg roder dagligt med, men mange folk tror det er meget besværligt at arbejde med, og det er det jo sådan set ikke, i hvert fald ikke når man bare skal bruge de basale ting.
    Glad for det kan inspirerer til leg :)

    Svar på kommentaren
  3. Skrevet af Martin  d. 12/05/2009 kl 13:47

    Synes der mangler nogle informationer. For det første er ZipArchive() er en class. Når du kører ovenstående får du følgende svar:

    Fatal error: Class ‘ZipArchive’ not found

    Så måske det ville være nice med class’en for at kunne fuldføre denne funktion.

    Svar på kommentaren

Skriv en kommentar

Krævede felter er markeret med *.

*