Comprimere file in archivi .zip con PHP

Giovanni Canella

06/09/2013

5148

In PHP, prima dell'avvento dalla versione 5.2.2, per gestire archivi compressi dovevamo rivolgerci a librerie esterne che come possiamo ben capire possono rallentare la nostra applicazione, ma questo problema non sussiste più.

Infatti da quella versione in poi possiamo maneggiare i seguenti archivi con funzioni native...

  • .zip,
  • .rar,
  • .phar
  • .bzip2,
  • .zlib.

Comprimere file in archivi: - .zip, - .rar, - .zlib  e molti altri  con    PHP!

...e in questo articolo vedremo come gestire ognuno di questi formati al meglio per aggiungere, eliminare comprimere file.

Ognuno di questi permette di comprimere/decomprimere dati senza perdita di informazioni, funzione fondamentale per immagazinare programmi e o informazioni importanti in modo che non vengano alterati

Il formato .zip, sviluppato da Phil Katz nel 1989, rilasciato sotto licenza GNU, è supportato di default dalla maggior parte dei sistemi operativi con scarse funzionalità. In alternativa il programma consigliato per aprire questi archivi è l'open soruce 7-Zip.

Per gestire questo formato useremo la classe nativa ZipArchive(). Di seguito ecco i metodi principali che andremo a utilizzare per il nostro scopo:

open($nome, $modalità)

Apre l'archivio .zip, con il nome del primo parametro, per leggerlo, modificarlo, eliminarlo a seconda della variabile $modalità impostata, che può assumere uno dei seguenti valori:

  • ZipArchive::OVERWRITE: Crea sempre un nuovo archivio sovrascrivendolo se già esistente
  • ZipArchive::CREATE: Crea l'archivio se non esiste
  • ZipArchive::EXCL: Mostra un errore se l'archivio è già esistente
  • ZipArchive::CHECKCONS: Controlla se l'archivio immesso è danneggiato, in caso positivo restituisce un messaggio di errore.
$zip = new ZipArchive();

$archivio = $zip->open("archivio.zip", ZipArchive::CREATE);

if ($archivio === TRUE) {
	echo "Archivio creato con successo!";
	$zip->close();
} else {
	echo "Errore durante la creazione. Messaggio di errore " . $archivio . "";
}

Restituisce TRUE in caso positivo, altrimenti uno dei seguenti errori:

  • ZipArchive::ER_OPEN: Problema durante l'apertura dell'archivio,
  • ZipArchive::ER_READ: Problema durante la lettura dell'archivio,
  • ZipArchive::ER_EXIST: Impossibile trovare l'archivio,
  • ZipArchive::ER_NOENT: Nessun file presente nell'archivio,
  • ZipArchive::ER_MEMORY: Problema durante l'allocazione della memoria,
  • ZipArchive::ER_NOZIP: L'archivio inserito  non è un pacchetto .zip valido.

addEmpryDir($cartella)

Aggiunge una cartella vuota all'interno dell'archivio dopo averlo aperto con open().

if($zip->addEmptyDir("ginho")) {
	echo "Cartella vuota ginho/ creata con successo! :D";
} else {
	echo "Errore durante la creazione di una cartella vuota :(";
}

Restituisce TRUE in caso di successo e FALSE in caso contrario.

addFile($percorsoFile)

Aggiunge il file passato come parametro all'archivio.

$file = "percorso/file.txt";

if(file_exists($file)) {
	if($zip->addFile($file)) {
		echo "File inserito con successo! :D";
	} else {
		echo "Impossibile inserire il file all'interno dell'archivio :(";
	}
} else {
	echo "FIle inesistente :(";
}

Possiamo passare al metodo un secondo parametro (opzionale) in modo da rinominarlo prima di essere inserito:

$zip->addFile($file, "ginho.txt")

Restituisce TRUE in caso di successo, FALSE in caso contrario.

addFromString($file, $contenuto)

Aggiunge un file creato in base al contenuto che desideriamo, impostato nel secondo parametro. Se il file esiste verrà sovrascritto.

$file = "percorso/ginho.txt";

if ($zip->addFromString($file, "Il contenuto del file che verrà inserito è stabilito da questa stringa")) {
    echo "Inserito con successo! :D";
} else {
    echo "Errore durante l'inserimento :(";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario.?

extractTo($cartella, $file = array())

Estrae tutto il contenuto dell'archivio, o i file desiderati specificati nel secondo parametro opzionale, nel percorso specificato.  Quest'ultimo può essere un singolo file se passiamo una normale stringa, o più elementi se usiamo un array.

if ($zip->extractTo("archivio_estratto/")) {
	echo "File estratti con successo! :D";
} else {
	echo "Errore durante l'estrazione :(";
}

Oppure dei file specificati:

$file = array(
	"ginho.txt",
	"pro.txt",
	"money.txt"
);

if ($zip->extractTo("archivio_estratto/", $file)) {
	echo "File estratti con successo! :D";
} else {
	echo "Errore durante l'estrazione :(";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario.?

setArchiveComment($commento)

Imposta il commento relativo all'archivio. 

if ($zip->setArchiveComment("ginho.it") === TRUE) {
	echo "Commento archivio inserito correttamente.";
} else {
	echo "Errore durante l'inserimento del commento.";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario.?

 

getArchiveComment()

Ottiene il commento dell'archivio .zip

echo $zip->getArchiveComment();

Restituisce TRUE in caso di successo, FALSE in caso contrario.?

unchangeAll()

Annulla tutte le modifiche apportate all'archivio.

if ($zip->unchangeAll() === TRUE) {
	echo "Modifiche annullate correttamente!";
} else {
	echo "Errore durante l'annullamento delle modifiche.";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario

 

renameName($vecchioNome, $nuovoNome)

Rinomina il file selezionato con il nome del secondo parametro passato.

if ($zip->renameName("money.txt", "big_money.txt") === TRUE) {
	echo "File rinominato con successo! :D";
} else {
	echo "Impossibile rinominare il file :(";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario.

deleteName($file)

Elimina il file impostato dall'archivio:

if ($zip->deleteName("ginho.txt")) {
	echo "Eliminato con successo! :D";
} else {
	echo "Errore durante l'eliminazione :(";
}

Restituisce TRUE in caso di successo, FALSE in caso contrario.

close()

Salva e chiude l'archivio aperto. Restituisce TRUE in caso di successo e FALSE in caso di errore. Sebbene venga chiamato automaticamente alla fine dello script, è buona norma farlo manualmente. (come anche spiegato poco tempo fa nell'articolo su come gestire file e cartelle in PHP). 

Esempio generale

Dopo aver visto le funzioni di base della classe, vediamo un esempio pratico di utilizzo.

$zip = new ZipArchive();

if($zip->open("archivio.zip", ZIPARCHIVE::CREATE)) {
	$zip->addEmptyDir("articoli");
	$zip->addFromString("articoli/guida pdo.txt", "Il sito che parla di tutto ciò che ruoto attorno all'informatica!\n");
	$zip->addFromString("articoli/pro.txt", "Sono PRO\n");
	$zip->addFile("index.php");
	
	$zip->close();
	unset($zip);
} else {
	echo "Impossibile creare l'archivio!";
}

$zip = new ZipArchive();
$zip->open("archivio.zip");
$zip->extractTo("archivio/", "index.php");

$zip->deleteName("articoli/guida pdo.txt");
$zip->deleteName("articoli/pro.txt");
$zip->close();

 

In pratica abbiamo creato un nuovo archivio con open e il parametro (ZIPARCHIVE::CREATE), aggiunto due file (guida pdo.txt, pro.txt) in base al testo da noi impostato sul momento (ideale per operazioni "dinamiche") e un file presente nel nostro sito (index.php).

Abbiamo chiuso il file e salvato le modifiche.

Successivamente lo riapriamo ed estraiamo tutto il contenuto nella cartella "articoli/" fatta eccezione per il file index infine eliminiamo i due file di testo dentro la cartella precedentemente creata e chiudiamo l'archivio.

Archivio .zip creato con PHP (Esempio)

Trovati 4 elementi:
Nome: ginho.txt
Nome: articoli.txt
Nome: php.txt
Nome: money.txt

Ti potrebbero interessare

I più letti