Php – Zippare una cartella con sottocartelle e file (creare un archivio)

Il php mette a disposizione una classe, chiamata ZipArchive, il cui scopo è di creare archivi di file e di cartelle. In soldoni, con questa classe possiamo creare e leggere file zip, che saranno o sono salvati sul server.
L’utilità può essere molteplice, come per esempio il backup di alcune cartelle o la compressione di alcuni file particolarmente pesanti prima di metterli a disposizione del pubblico.

In questo articolo vedremo uno script per aggiungere una cartella a un archivio. Ogni sua sottocartella e relativi file saranno aggiunti all’archivio allo stesso modo.
Se l’archivio non esiste già, sarà creato.

Lo script può essere usato così com’è, modificando esclusivamente le variabili:
$dir : cartella di destinazione dell’archivio
$name : nome dell’archivio da creare/leggere
$dir_name : nome della cartella da aggiungere all’archivio

L’archivio zip sarà creato allo stesso livello della cartella da aggiungervi. Naturalmente, con piccole modifiche alle varibili è possibile dargli in pasto qualsiasi percorso.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
/**
* Aggiunge una cartella e le sue sottocartelle e i file contenuti a un archivio
* se l'archivio non esiste, lo crea
*/

//creazione dell'oggetto di classe
$zip = new ZipArchive();

//cartella generale
$dir = "test/zip_example/";

$name = "test_with_subfolders.zip"; //nome dell'archivio
$filename = $dir.$name; //indirizzo completo dell'archivio

$zip->open($filename, ZipArchive::CREATE); 

$dir_name = 'folder_to_add'; //nome della cartella da zippare
$dir_path = $dir.$dir_name; //indirizzo completo della cartella da zippare

if(!is_dir($dir_path)){ 
    throw new Exception('La cartella ' . $dir.$dir_path . ' non esiste'); 
} 

//aggiunge lo slash finale (o corrispettivo) se non presente nel nome cartella
if(substr($dir_path, -1) != DIRECTORY_SEPARATOR){ 
    $dir_path.= DIRECTORY_SEPARATOR; 
} 

$dirStack = array($dir_path); 

//trova l'indice da cui inizia l'ultima cartella
$cutFrom = strrpos(substr($dir_path, 0, -1), '/')+1;

while(!empty($dirStack)){

    $currentDir = array_pop($dirStack); 
    $filesToAdd = array(); 

    $dir_folder = dir($currentDir); 
    while( false !== ($node = $dir_folder->read()) ){ 

        if( ($node == '..') || ($node == '.') ){ 
            continue; 
        } 

        if(is_dir($currentDir . $node)){ 
            array_push($dirStack, $currentDir . $node . '/'); 
        } 

        if(is_file($currentDir . $node)){ 
            $filesToAdd[] = $node; 
        } 

    } 

    $localDir = substr($currentDir, $cutFrom); 
    $zip->addEmptyDir($localDir); 

    foreach($filesToAdd as $file){ 
        $zip->addFile($currentDir . $file, $localDir . $file); 
    } 

} 

$zip->close();
Fonti esterne

La classe ZipArchive su php.net

Etichette:, ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *