login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
MindPrison
Moeilijkheidsgraad:
Normaal
Hits:
19497
Punten:
Aantal punten:
 (4.56)
Aantal stemmen:
9
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (5)
 



Tutorial:

Zip bestanden

1. Inleiding en voorbereiding
2. Een .zip aanmaken
3. Toevoegen
4. Verwijderen
5. Inlezen
6. Uitpakken
7. Optionele argumenten
8. Teruggegeven waardes
9. Slot

1. Inleiding en voorbereiding
Het maken van .zip bestanden kan in veel situaties van pas komen, hier geef ik een korte introductie over het maken van zip's met behulp van de PclZip class. Deze tutorial is eigenlijk grotendeels een vertaling van de originele handleiding van PclZip.

Voor we kunnen beginnen moet je eerst 2 dingen doen:
  - PclZip downloaden (zonder "Trace")
  - Een map op je server maken, die je chmod met de rechten "777"

Momenteel maak ik gebruik van versie 2.4, maar al deze code zal normaal gezien ook bij nieuwere versies werken.
Als laatste, wil ik even vernoemen dat er ook PclTar bestaat, deze class dient om .tar, .tar.gz of .tgz bestanden te maken. Maar hierover geef ik geen uitleg (want ik heb het nog nooit gebruikt).

 top

2. Een .zip aanmaken
Het aanmaken van een zip bestand is zeer simpel, onderstaande code is alles wat nodig is:
1
2
3
4
5
6
7
<?php
require_once("pclzip.lib.php"); // Lees de class in

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if(
$zip->create("/var/www/bestand.txt") == 0)
  die(
"Error : " $zip->errorInfo(true));
?>

Korte uitleg over de code:
  • Op lijn 4 maak je een nieuw zip bestand aan, tussen de () geef je de bestandsnaam.
  • Op lijn 5 voeg je een bestand toe aan de zip, dit kan op verschillende manieren:
    • Je geeft een string met de locatie van 1 bestand of map.
    • Je geeft een array met bestanden of mappen.
    • Je geeft een string met bestanden of mappen, gescheiden door komma's (vb: $zip->create("/var/www/bestand.txt,/var/www/backup")).
  • Indien je een map opgeeft, zal heel deze map met submappen toegevoegd worden.
  • De functies van PclZip geven een 0 bij een error, je kan de error dan laten weergeven met de code die op lijn 6 staat. De error's zijn in het Engels...

Optionele argumenten voor create() zijn:
  - PCLZIP_OPT_REMOVE_PATH
  - PCLZIP_OPT_REMOVE_ALL_PATH
  - PCLZIP_OPT_ADD_PATH
  - PCLZIP_CB_PRE_ADD
  - PCLZIP_CB_POST_ADD
  - PCLZIP_OPT_NO_COMPRESSION
  - PCLZIP_OPT_COMMENT

 top

3. Toevoegen
Het toevoegen van een bestand of map is identiek aan het aanmaken van een zip bestand. Het enige verschil is dat, create() nu add() wordt. Je krijgt dus:
1
2
3
4
5
6
7
<?php
require_once("pclzip.lib.php"); // Lees de class in

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if(
$zip->add("/var/www/bestand.txt") == 0)
  die(
"Error : " $zip->errorInfo(true));
?>

Nu geef je op lijn 4 de locatie van een bestaand zip bestand, indien dit bestand niet bestaat zal het aangemaakt worden.
Hou er echter rekening mee dat bestanden die reeds voorkopen in de zip niet overschreven zullen worden, het nieuwe bestand wordt gewoon achteraan de zip toegevoegd.

Optionele argumenten voor add() zijn:
  - PCLZIP_OPT_REMOVE_PATH
  - PCLZIP_OPT_REMOVE_ALL_PATH
  - PCLZIP_OPT_ADD_PATH
  - PCLZIP_CB_PRE_ADD
  - PCLZIP_CB_POST_ADD
  - PCLZIP_OPT_NO_COMPRESSION
  - PCLZIP_OPT_COMMENT
  - PCLZIP_OPT_ADD_COMMENT
  - PCLZIP_OPT_PREPEND_COMMENT

 top

4. Verwijderen
Als je een volledige zip wil verwijderen, doe je het volgende:
1
2
3
4
5
6
7
<?php
require_once("pclzip.lib.php"); // Lees de class in

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if(
$zip->delete() == 0)
  die(
"Error : " $zip->errorInfo(true));
?>

Op lijn 4 geef je de locatie van het zip bestand, anders zal het verwijderen logischerwijs niet lukken...
Als je alleen bepaalde bestanden wilt verwijderen, zijn er 4 manieren om dit te doen:
  - Volgens index: delete(PCLZIP_OPT_BY_INDEX,"1-3,5,8-10"); - De bestanden met index 1 tot 3, 5 en 8 tot 10 worden verwijderd.
  - Volgens naam: delete(PCLZIP_OPT_BY_NAME,"bestand.txt"); - Het bestand met de naam "bestand.txt" wordt verwijderd.
  - Met ereg(): delete(PCLZIP_OPT_BY_EREG,"png$"); - Alle "png" bestanden worden verwijderd.
  - Met preg(): delete(PCLZIP_OPT_BY_PREG,"txt$"); - Alle "txt" bestanden worden verwijderd.

Deze 2 laatste doen dus hetzelfde, maar ze filteren via een andere reguliere expressie.
Let op: Mappen hebben hun eigen index, als je dus een map met de index-methode verwijderd, is de inhoud van die map nog steeds aanwezig

 top

5. Inlezen
Met de functie listContent() krijg je een hele hoop info over je zip bestand, hier is een voorbeeldje:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include_once("pclzip.lib.php");

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if((
$lijst $zip->listContent()) == 0)
  die(
"Error : " $zip->errorInfo(true));

for(
$i 0$i sizeof($lijst); $i++)
{
  for(
reset($lijst[$i]); $key key($lijst[$i]); next($lijst[$i]))
    echo 
"Bestand " $i " &gt;&gt; " $key ": " $lijst[$i][$key] . "<br />";
  echo 
"<br />";
}

?>

Bovestaande code kan als resultaat geven:
Bestand 0 >> filename: scripts/database.php
Bestand 0 >> stored_filename: scripts/database.php
Bestand 0 >> size: 31
Bestand 0 >> compressed_size: 22
Bestand 0 >> mtime: 1140547093
Bestand 0 >> comment: databasescript
Bestand 0 >> folder: 0
Bestand 0 >> index: 0
Bestand 0 >> status: ok

Op deze manier kan je gemakkelijk een lijstje maken van alle bestanden in een zip:
1
2
3
4
5
6
7
8
9
10
<?php
include_once("pclzip.lib.php");
  

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if((
$lijst $zip->listContent()) == 0)
  die(
"Error : " $zip->errorInfo(true));

for(
$i 0$i sizeof($lijst); $i++)
  echo 
$lijst[$i]["filename"] . "<br />";
?>

 top

6. Uitpakken
Een volledig archief uitpakken gaat als volgt:
1
2
3
4
5
6
7
<?php
require_once("pclzip.lib.php"); // Lees de class in

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if(
$zip->extract() == 0)
  die(
"Error : " $zip->errorInfo(true));
?>

Hierdoor wordt de gehele inhoud uitgepakt in de huidige map, de functie geeft een array terug met alle bestanden die uitgepakt werden.

Optionele argumenten voor extract() zijn:
  - PCLZIP_OPT_PATH
  - PCLZIP_OPT_REMOVE_PATH
  - PCLZIP_OPT_REMOVE_ALL_PATH
  - PCLZIP_OPT_ADD_PATH
  - PCLZIP_CB_PRE_EXTRACT
  - PCLZIP_CB_POST_EXTRACT
  - PCLZIP_OPT_SET_CHMOD
  - PCLZIP_OPT_BY_NAME
  - PCLZIP_OPT_BY_EREG
  - PCLZIP_OPT_BY_PREG
  - PCLZIP_OPT_BY_INDEX
  - PCLZIP_OPT_EXTRACT_AS_STRING
  - PCLZIP_OPT_EXTRACT_IN_OUTPUT

 top

7. Optionele argumenten en teruggegeven waardes
Optionele argumenten voeg je altijd toe achter de verplichte waardes, je geeft eerst het argument en daarna de waarde ervan.
Een voorbeeld met de add() functie:
1
2
3
4
5
6
7
<?php
include_once("pclzip.lib.php");

$zip = new PclZip("/var/www/mijn_site/tmp/archief.zip");
if((
$zip->add("data/test.txt"PCLZIP_OPT_REMOVE_PATH"data")) == 0)
  die(
"Error : " $zip->errorInfo(true));                        
?>

Op deze manier kan je zoveel argumenten toevoegen als naar wens, gewoon altijd scheiden door een komma...

De betekenis van de argumenten is als volgt:
PCLZIP_OPT_PATHSpecificeer een map waar de bestanden uitgepakt moeten worden
(vb: "var/www/uitpakken/").
PCLZIP_OPT_ADD_PATHVoeg een map toe (vb: "backup" -> "bestand.txt" word dan "backup/bestand.txt").
PCLZIP_OPT_REMOVE_PATHVerwijder een map (vb: "backup" -> "backup/bestand.txt" word dan "bestand.txt").
PCLZIP_OPT_REMOVE_ALL_PATHVerwijder alle paden, geen waarde nodig
(vb: "backup/map2/bestand.txt" word dan "bestand.txt").
PCLZIP_OPT_SET_CHMODStel de rechten van de bestanden in, geef de octale waarde (vb: 0777) -> nog in testfase.
PCLZIP_OPT_BY_NAMEFilter volgens naam -> zie verwijderen.
PCLZIP_OPT_BY_EREGFilter volgens ereg() -> zie verwijderen.
PCLZIP_OPT_BY_PREGFilter volgens preg() -> zie verwijderen.
PCLZIP_OPT_BY_INDEXFilter volgens index -> zie verwijderen.
PCLZIP_OPT_EXTRACT_AS_STRINGGeeft het bestand in een string, geen waarde nodig -> Er mag maar 1 bestand in de zip zitten, of je moet filteren.
PCLZIP_OPT_EXTRACT_IN_OUTPUTGeeft het bestand direct weer (&echo" eigelijk), geen waarde nodig -> Er mag maar 1 bestand in de zip zitten, of je moet filteren.
PCLZIP_OPT_NO_COMPRESSIONVoeg een bestand toe zonder het te compresseren, geen waarde nodig.
PCLZIP_OPT_COMMENTVoeg commentaar toe aan het archief.
PCLZIP_OPT_ADD_COMMENTVoeg commentaar toe achteraan het einde van de huidige commentaar (de tekst wordt er achter "geplakt").
PCLZIP_OPT_PREPEND_COMMENTVoeg commentaar toe voor de huidige commentaar (de tekst wordt er voor "geplakt").

PCLZIP_CB_PRE_ADD, PCLZIP_CB_POST_ADD, PCLZIP_CB_PRE_EXTRACT en PCLZIP_CB_POST_EXTRACT zijn geavanceerde argumenten die ik niet nader bespreek.
Met deze argumenten kun je functies voor of na het toevoegen/verwijderen van bestanden laten uitvoeren. Zo word het mogelijk om bestanden te sorteren e.d. Meer uitleg vind je hier.

 top

8. Teruggegeven waardes
Indien er zich een fatale error voordeed, geeft PclZip een 0 terug, maar indien dit niet het geval is geven de functies een array terug met verschillende waardes. Dit zijn ze:
  - filename: De bestandsnaam (bij add() is dit de opgegeven naam en bij extract() is dit de naam waar het bestand uitgepakt is).
  - stored_filename: De naam waaronder het bestand opgeslagen is.
  - size: De echte grootte van het bestand.
  - compressed_size: De gecompresseerde grootte van het bestand.
  - mtime: Laatste wijzigingstijdstip (timestamp).
  - comment: De bijhorende commentaar.
  - folder: Is het een bestand of een map? ("TRUE" of "FALSE").
  - index: Geeft de index (indien die bestaat).
  - content: Geeft de inhoud van een bestand (alleen bij "PCLZIP_OPT_EXTRACT_AS_STRING")
  - status: Het resultaat van de actie, dit kan zijn (alleen bij "ok" is de actie gelukt):
     + ok = In orde
     + filtered = Het bestand werd weggefilterd.
     + already_a_directory = De map bestaat al.
     + newer_exist = Een nieuwer bestand bestond al.
     + write_protected = Het bestand bestond al en was tegen schrijven beveiligd.
     + path_creation_fail = De map kon niet aangemaakt worden.
     + write_error = Het schrijven mislukte.
     + read_error = Het lezen mislukt.
     + invalid_header = De header is ongeldig.
     + skipped = Het bestand werd overgeslagen.
     + filename_too_long = De bestandsnaam is langer dan 255 tekens.

 top

9. Slot
Ziezo, hopelijk heb je er wat aan gehad. Vergeet niet dat PclZip nog enkele functies heeft, maar hiervoor moet je de on-line handleiding raadplegen.


« Vorige tutorial : Veilig paginasysteem Volgende tutorial : CURL nader verklaard »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.018s