Come zippare e decomprimere i file in PHP

La compressione dei file durante il loro trasferimento su Internet ha molti vantaggi. Nella maggior parte dei casi, la dimensione totale combinata di tutti i file nel formato compresso scende di un buon margine. Ciò significa che si risparmia parte della larghezza di banda e che gli utenti otterranno anche velocità di download più elevate. Una volta che gli utenti hanno scaricato un file, possono decomprimerlo quando vogliono. In breve, la compressione può rendere molto più semplice per te e per i visitatori i file di servizio su Internet.

Un fattore che può scoraggiarti dalla compressione dei file o rendere il processo molto faticoso è il fatto che potresti farlo manualmente. Fortunatamente, PHP ha molte estensioni che si occupano specificamente della compressione e dell'estrazione dei file. Puoi utilizzare le funzioni disponibili in queste estensioni per comprimere automaticamente i file in PHP.

Questo tutorial ti insegnerà come comprimere e decomprimere (comprimere ed estrarre) i file da e verso un archivio zip in PHP. Imparerai anche come eliminare o rinominare i file in un archivio senza estrarli per primi.

Comprimere i file in PHP

Il PHP ZipArchive class ha molte proprietà e metodi che possono aiutarti a comprimere e decomprimere tutti i tuoi file.

Comprimi file individuali

Puoi aggiungere file al tuo archivio zip uno alla volta o aggiungere l'intera directory in una volta. In entrambi i casi, il primo passo è la creazione di un nuovo ZipArchive istanza e quindi chiamando il open ($ filename, [$ flags]) metodo. Questo metodo aprirà un nuovo archivio zip per leggere, scrivere o altre modifiche. Ci sono quattro valori validi per l'opzionale $ bandierina parametro che determina come gestire le diverse situazioni.

  • ZipArchive :: OVERWRITE-Questo flag sovrascriverà i contenuti nell'archivio specificato se già esiste.
  • ZipArchive :: Create-Questo flag creerà un nuovo archivio se non esiste già.
  • ZipArchive :: EXCL-Questo flag genererà un errore se l'archivio esiste già.
  • ZipArchive :: CHECKCONS-Questo flag indicherà a PHP di eseguire controlli di coerenza aggiuntivi sull'archivio e dare un errore se falliscono.

È possibile controllare la documentazione di questo metodo per conoscere i diversi codici di errore restituiti in caso di errori di apertura del file. Se il file zip è stato aperto o creato correttamente, il metodo restituirà vero.

Dopo aver aperto l'archivio con successo, è possibile utilizzare il addFile ($ filename, $ localname, $ start, $ length) metodo per aggiungere qualsiasi file da un determinato percorso al tuo archivio. Il $ filename parametro è il percorso di un file che si desidera aggiungere all'archivio. Il $ localName parametro viene utilizzato per assegnare un nome al file per memorizzarlo all'interno dell'archivio. Puoi chiamare Aggiungi file() ogni volta che vuoi aggiungere un nuovo file al tuo archivio.

Dopo aver aggiunto tutti i file necessari all'archivio, puoi semplicemente chiamare il vicino() metodo per chiuderlo e salvare le modifiche.

Supponiamo che tu abbia un sito Web che consente agli utenti di scaricare file di font per diversi tipi di carattere insieme alle informazioni sulla licenza per utilizzarli. File come questi saranno esempi perfetti di archiviazione automatizzata usando PHP. Il seguente codice mostra come fare esattamente questo.

open ('compressed / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('font / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('fonts / Monoton / OFL.txt', 'license.txt'); $ Archivio zip> close (); ?>

Iniziamo creando un ZipArchive istanza e quindi utilizzando il Aperto() metodo per creare il nostro archivio. Il Aggiungi file() il metodo aggiunge il nostro effettivo .ttf file di caratteri e il .testo file di licenza per l'archivio.

Si dovrebbe notare che i file originali erano all'interno del fonts / Monoton directory. Tuttavia, il codice PHP lo inserisce direttamente nella radice del nostro archivio. È possibile modificare la struttura delle directory e i nomi dei file in corso nell'archivio.

Comprimere più file da una directory

L'aggiunta di singoli file al tuo archivio può diventare stancante dopo un po '. Ad esempio, potresti voler creare un archivio di tutti .PDF o .png file in una directory. Il addGlob ($ modello, $ bandiere, $ opzioni) il metodo si rivelerà molto utile in questo caso. L'unico svantaggio di questo metodo è che si perde il controllo sulla posizione dei singoli file nell'archivio. Tuttavia, puoi ancora influenzare la struttura delle directory all'interno dell'archivio usando $ options parametro. Le opzioni vengono passate sotto forma di un array associativo.

  • add_path-Il valore che assegni add_path è prefissato al percorso locale del file all'interno dell'archivio.
  • remove_path-Il valore che assegni remove_path è usato per rimuovere un prefisso corrispondente dal percorso di diversi file che vengono aggiunti all'archivio.
  • remove_all_path-Impostazione del valore di remove_all_path a vero rimuoverà tutto dal percorso del file oltre al suo nome. In questo caso, i file vengono aggiunti alla radice dell'archivio.

È importante ricordare che la rimozione di un percorso viene eseguita prima del prefisso del valore specificato in add_path.

Lo snippet di codice seguente ne farà l'uso addGlob () e tutte queste opzioni più chiare.

$ zip = new ZipArchive (); $ zip-> apri ('compresso / user_archive.zip', ZipArchive :: CREATE); $ options = array ('add_path' => 'light_wallpapers /', 'remove_all_path' => TRUE); $ zip-> addGlob ('lights / *. jpg', 0, $ options); $ options = array ('add_path' => 'font_files /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documents / *. ttf', 0, $ options); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documenti / *. pdf', 0, $ opzioni); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('documenti / *. jpg, png', GLOB_BRACE, $ opzioni); $ Archivio zip> close ();

Come al solito, iniziamo creando un ZipArchive istanza e quindi utilizzare il Aperto() metodo per creare il nostro archivio. Specifichiamo anche diversi valori per il add_path chiave nel $ options array ogni volta prima di chiamare il addGlob () metodo. In questo modo, possiamo gestire un insieme specifico di file alla volta e fornire le opzioni di archiviazione di conseguenza.

Nel primo caso, iteriamo su tutto .jpg file nel luci directory e inserirli nel light_wallpapers directory nell'archivio. Allo stesso modo, iteriamo su tutto il .ttf file nel documenti directory e quindi inserirli in una cartella chiamata font_files nel nostro archivio. Infine, iteriamo su tutto il .jpg e .png file nei nostri documenti in una sola volta e metterli tutti insieme nel immagini elenco.

Come puoi vedere, i valori in $ options parametro sono utili nell'organizzazione del contenuto all'interno dell'archivio.

Estrazione del contenuto da un archivio

Il ZipArchive la classe ha un metodo chiamato extractTo ($ destination, $ entries) per estrarre il contenuto di un archivio. Puoi usarlo per estrarre tutto all'interno dell'archivio o solo alcuni file specifici. Il $ iscrizioni parametro può essere usato per specificare un singolo nome di file che deve essere estratto, oppure puoi usarlo per passare una serie di file.

Un punto importante da ricordare è che è necessario specificare il percorso corretto del file all'interno dell'archivio per estrarlo. Ad esempio, abbiamo archiviato un file di font chiamato AlegreyaSans-Light.ttf nella sezione precedente. Il file è stato memorizzato all'interno dell'archivio in una directory chiamata font_files. Ciò significa che il percorso che devi specificare nel file $ iscrizioni parametro sarebbe font_files / AlegreyaSans-Light.ttf e non semplicemente AlegreyaSans-Light.ttf.

La directory e la struttura dei file verranno conservate durante il processo di estrazione e i file verranno estratti nelle rispettive directory.

open ('compressed / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ Archivio zip> close (); ?>

Se ometti il ​​secondo parametro, il metodo estrarrà tutti i file nell'archivio.

Ottieni più controllo sugli archivi

Il ZipArchive class ha anche molti altri metodi e proprietà per aiutarti a ottenere maggiori informazioni sull'archivio prima di estrarne tutti i contenuti.

Puoi contare il numero di file in un archivio usando il contare() metodo. Un'altra opzione è usare il numFiles proprietà. Possono essere utilizzati per scorrere tutti i file nell'archivio e estrarre solo quelli necessari, oppure puoi fare qualcos'altro con loro, come rimuoverli dall'archivio.

Nell'esempio seguente, stiamo eliminando tutti i file nell'archivio che contengono la parola Corsivo. Un codice simile potrebbe essere usato per cancellare tutti i file che non contengono una parola specifica. Si potrebbe anche scorrere su questi file e sostituire una parola particolare con qualcos'altro.

open ('compressed / user_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); per ($ i = 0; $ i < $file_count; $i++)  $file_name = $zip->getNameIndex ($ i); if (stripos ($ file_name, 'Italic')! == false) $ zip-> deleteName ($ file_name);  $ zip-> close (); ?>

Nel codice sopra, stiamo usando deleteName () per cancellare un singolo file. Tuttavia, puoi anche usarlo per cancellare un'intera directory.

Una funzione simile renameName ($ oldname, $ newname) può essere usato per cambiare il nome di qualsiasi file nell'archivio. Si riceverà un errore se un file è intitolato $ newname esiste già.

Pensieri finali

Abbiamo coperto un sacco di metodi molto utili di ZipArchive classe che renderà la compressione e l'estrazione automatizzata dei file in PHP un gioco da ragazzi. Ora dovresti essere in grado di comprimere singoli file o un gruppo di essi contemporaneamente, in base ai tuoi criteri. Allo stesso modo, dovresti essere in grado di estrarre qualsiasi file particolare dall'archivio senza influenzare altri contenuti.

Con l'aiuto di contare() e numFiles, otterrete un maggiore controllo sui singoli file e ridenominarli o eliminarli sarebbe semplicissimo. Dovresti leggere la documentazione almeno una volta per leggere ulteriori funzioni di questo tipo.