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(); |
Salve,
ii miei complimenti per l’ottimo script proposto.
Una piccolissima domanda: Esiste un metodo per zippare tutto il mio sito partendo datta root?
Grazie mille per eventuali suggerimenti.
Gianfranco
Ciao Gianfranco,
è sufficiente impostare la variabile in questo modo:
$dir_name = ‘.’;
Buonasera,
ho provato e in locale (uwamp – localhost) funziona correttamente ma, quando uso lo script nella root (cartella iniziale del sito – http://www.assopensmps.it) il seguente comando :
$dir_folder = dir($currentDir);
mi ritorna il seguente errore:
Warning: dir(\,\): Access is denied. (code: 5)
Penso che derivi dal fatto che non ho accesso alla cartella fisica precedente a assopensmpsit gestita dall’hosting di Aruba.
Esiste un comando simile a dir *.* del Dos da implementare su php?
Grazie mille.
Buona serata.
Gianfranco