La classe php ZipArchive
Per zippare un file ci viene in aiuto la classe di php ZipArchive() , attraverso la quale possiamo creare un file zip dentro la nostra cartella della root del sito, in maniera da inserisci dentro tutti i file che desideriamo archiviare come ad esempio un file grafico inviato al server mediante upload da un form.
Il codice base per creare una cartella zip e inserire dentro un file è:
$time = time();
$archivia = new ZipArchive();
$nome_file = $time."_archivio.zip";
if ($archivia->open($nome_file, ZIPARCHIVE::CREATE)!==TRUE)
{
@exit("Impossibile aprire <$nome_file>\n");
}
$archivia->addFile("Mio_File.png");
echo "Sono stati zippati: " . $archivia->numFiles . " file.\n";
$archivia->close();
Creare un archivio zip
Come funziona lo script?
Innanzitutto diamo un nome univoco al nostro archivio zip in maniera tale che in caso di file grafici, testuali o altri, con stesso nome non possano essere sovrascritti all'interno del file zip, quindi impostiamo una variabile con il valore di time() (ora corrente in secondi dal 1970)
- Memorizziamo il tempo in secondi in una variabile $time = time(); es: 1622027263
- Con new ZipArchive(); istanziamo la classe ZipArchive
- Diamo un nome al nostro archivo zip: $nome_file = $time."_archivio.zip"; preceduto dalla variabile time come detto per assegnare un valore univoco al file zip, es: 1622027263_archivio.zip,
- Con la funzione addFile assegniamo il file grafico o altro file da comprimere dentro il file zip.
Dentro addFile è possibile far passare delle variabili contenenti i nomi dei file da zippare ad esempio ogni qualvolta si esegue un upload per memorizzare i dati dentro un database e quindi creare a sua volta un archivio
Upload e comprimi il file zippandolo
Vediamo un esempio pratico su un possibile utilizzo della classe ZipArchive() abbinata ad un semplice sistema di upload di file, partiamo dal semplice form:
<form action="#" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
Ora creiamo una funzione zippaFile() includendo il nostro codice ZipArchive:
function zippaFile($file)
{
$time = time();
$archivia = new ZipArchive();
$nome_file = $time."_archivio.zip";
if ($archivia->open($nome_file, ZIPARCHIVE::CREATE)!==TRUE) {
@exit("Impossibile aprire <$nome_file>\n");
}
$archivia->addFile("tuaCartellaUploads/".$file);
echo "Sono stati zippati: " . $archivia->numFiles . " file.\n";
$archivia->close();
}
Nella funzione zippaFile() faremo passare le variabili realtive ai nomi dei file $file che verranno caricati sul server tramite la funzion $archivia->addFile("tuaCartellaUploads/".$file);
Per semplicità utilizziamo un piccolo script upload che ci aiuterà a caricare i file dentro la nostra cartella tuaCartellaUploads, ovviamente si possono utilizzare qualsiasi sistema anche gestito da ajax.
$target_dir = "tuaCartellaUploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
$uploadOk = 1;
} else {
$uploadOk = 0;
}
}
if (file_exists($target_file)) {
$uploadOk = 0;
}
if ($_FILES["fileToUpload"]["size"] > 500000) {
$uploadOk = 0;
}
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
$uploadOk = 0;
}
if ($uploadOk == 0) {
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo $file = htmlspecialchars( basename( $_FILES["fileToUpload"]["name"]));
////////////////////////////////////////////////
zippaFile($file); /// funzione ZipArchive
//////////////////////////////////////////////////
} else {
echo('notifica ecc...');
}
}
Come funziona lo script?
E' molto semplice, nel momento in cui selezioniamo il nostro file da inviare al server, lo script upload elaborerà i parametri del file e lo invierà nella directory memorizzata nella variabile $target_dir, il nome del file verrà memorizzato nella variabile $file che a sua volta verrà fatta passare dentro la funzione zippaFile($file), e il risultato sarà visibile nella root del vostro sito con i file zippati con all'interno.