- Creare il form upload
- Generare un nome univoco per la directory
- Creare il percorso della directory
- Upload del file Zip
- Decomprimere il file zip
Supponiamo di voler creare un'area riservata per gli utenti e concedere loro di eseguire degli upload di file zippati decomprimendoli poi in una directory con un nome univoco.
Possiamo in questo caso procedere con un piccolo script di un upload, combinato con alcune funzioni php per la gestione della percorso delle directory di lavoro e la classe ZipArchive() per l'estrazione dei file zippati.
Creare il form upload
Per prima cosa creiamo il nostro form per l'invio dei file in upload per la nostra directory
File Index.html:
<form action="creaDirectoryUnzip.php" method="post" enctype="multipart/form-data">
Scegli file zip per upload:
<input type="file" name="myfile" id="myfile">
<input type="submit" value="Upload Zip" name="submit">
</form>
Generare un nome univoco per la directory
Dopo aver creato il form, creiamo il file php che si occuperà di generare la directory con un nome univoco che conterrà il file decompresso.
File creaDirectoryUnzip.php
Per prima cosa scriviamo una nostra funzione che servirà per generare una variabile contenete una stringa alfanumerica in questo caso di otto caratteri, ma è possibile agire sulla funzione substr(... 0, 12) per impostare ad esempio 12 caratteri, ecc.
function generaNomeDirectory(){
$serieCaratteri = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$numeroCar = substr(str_shuffle($serieCaratteri), 0, 8);
// restituisce ad es: $numeroCar = "IcF1xpdN";
return $numeroCar;
}
Creare il percorso della directory
Ora che abbiamo il nostro nome univoco per la directory passiamo a create una variabile con il percorso per l'upload del file:
$nomeCartella = generaNomeDirectory();
$directoryCorrente = getcwd();
$uploadDirectory = "/Uploads/".$nomeCartella."/";
La variabile
- $nomeCartella
conterrà la stringa univoca es: IcF1xpdN
la variabile
- $directoryCorrente
indicherà il pathname assoluto della directory per il nostro upload con la funzione php getcwd();
ed infine la variabile
- $uploadDirectory
con il percorso della cartella di upload e nome della directory es: $uploadDirectory = "/Uploads/IcF1xpdN/";
A questo punto siamo pronti per creare la nostra directory con il nome univoco, utilizzando la funzione file_exists() ci assicuriamo di non avere già una cartella con lo stesso nome e poi con la funzione mkdir() creiamo la directory impostando l'attributo con il permesso di scrittura a 755.
if (!file_exists(''.$uploadDirectory.'/')) {
mkdir('Uploads/'.$nomeCartella.'', 0755, true
}
Upload del file Zip
Infine scriviamo il codice necessario per eseguire l'upload del file e la rfelativa estrazione dentro la directory univoca:
$errors = [];
$fileExtensions = ['zip']; //estensione per i file zip
$fileName = $_FILES['myfile']['name'];
$fileSize = $_FILES['myfile']['size'];
$fileTmpName = $_FILES['myfile']['tmp_name'];
$fileType = $_FILES['myfile']['type'];
$fileExtension = strtolower(end(explode('.',$fileName)));
$uploadPath = $directoryCorrente. $uploadDirectory . basename($fileName);
if(isset($_POST['submit'])) {
if(! in_array($fileExtension,$fileExtensions)) {
$errors[] = "Estensione deil file errata, utilizzare solo file zip";
}
if($fileSize > 2000000) {
$errors[] = "Errore, il file è più di 2 MB";
}
if(empty($errors))
{
$didUpload = move_uploaded_file($fileTmpName, $uploadPath);
if($didUpload) {
////////////////////////UNZIP DEL FILE /////////////////////////////////////////////////////
$zip = new ZipArchive;
if ($zip->open('Uploads/'.$nomeCartella.'/'.$fileName.'') === TRUE) {
$zip->extractTo('Uploads/'.$nomeCartella.'/');
$zip->close();
echo '<br> Il file è stato estratto correttamente nella directory';
} else {
echo '<br> Errore FIle zip';
}
////////////////////////////////////////////////////////////////////////////////////////
}
else {echo "Errore upload"; }
} else {
foreach ($errors as $error) {
echo $error . "Ci sono errori" . "\n";
}
}
}
Questo è un classico script per effettuare un upload dentro una directory che è possibile sostituire un altro più performante ad esempio utilizzando jquery e ajax, prestando attenzione a inserire il tipo di estensione nella variabile $fileExtensions che ne nostro caso deve essere del tipo ZIP.
Decomprimere il file zip
Una volta effettuato l'upload senza alcun messaggio di errore, possiamo recuperare il file zip tramite la classe ZipArchive() e procedere con la la sua estrazione all'interno della directory univoca, creata precedentemente con la funzione generaNomeDirectory() e mkdir()
////////////////////////UNZIP DEL FILE /////////////////////////////////////////////////////
$zip = new ZipArchive;
if ($zip->open('Uploads/'.$nomeCartella.'/'.$fileName.'') === TRUE) {
$zip->extractTo('Uploads/'.$nomeCartella.'/');
$zip->close();
$percorso = 'Uploads/'.$nomeCartella.'/'.$fileName.'';
insertdatabase($percorso);
echo '<br> Il file è stato estratto correttamente nella cartella';
} else {
echo '<br> Errore FIle zip';
}
////////////////////////////////////////////////////////////////////////////////////////
Una volta estratto il file è possibile migliorare lo script ad esempio inserendo una funzione che provvederà a memorizzare il percorso del nostro file in un database:
$percorso = 'Uploads/'.$nomeCartella.'/'.$fileName.'';
insertdatabase($percorso);
Il codice completo
function generaNomeDirectory(){
$serieCaratteri = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$numeroCar = substr(str_shuffle($serieCaratteri), 0, 8);
return $numeroCar;
}
$nomeCartella = generaNomeDirectory();
$directoryCorrente = getcwd();
$uploadDirectory = "/Uploads/".$nomeCartella."/";
if (!file_exists(''.$uploadDirectory.'/')) {
mkdir('Uploads/'.$nomeCartella.'', 0755, true);
}
$errors = [];
$fileExtensions = ['zip']; //estensione per i file zip
$fileName = $_FILES['myfile']['name'];
$fileSize = $_FILES['myfile']['size'];
$fileTmpName = $_FILES['myfile']['tmp_name'];
$fileType = $_FILES['myfile']['type'];
$fileExtension = strtolower(end(explode('.',$fileName)));
$uploadPath = $directoryCorrente. $uploadDirectory . basename($fileName);
if(isset($_POST['submit'])) {
if(! in_array($fileExtension,$fileExtensions)) {
$errors[] = "Estensione deil file errata, utilizzare solo file zip";
}
if($fileSize > 2000000) {
$errors[] = "Errore, il file è più di 2 MB";
}
if(empty($errors))
{
$didUpload = move_uploaded_file($fileTmpName, $uploadPath);
if($didUpload) {
////////////////////////UNZIP DEL FILE /////////////////////////////////////////////////////
$zip = new ZipArchive;
if ($zip->open('Uploads/'.$nomeCartella.'/'.$fileName.'') === TRUE) {
$zip->extractTo('Uploads/'.$nomeCartella.'/');
$zip->close();
echo '<br> Il file è stato estratto correttamente nella cartella';
} else {
echo '<br> Errore FIle zip';
}
////////////////////////////////////////////////////////////////////////////////////////
}
else {echo "Errore upload"; }
} else {
foreach ($errors as $error) {
echo $error . "Ci sono errori" . "\n";
}
}
}