Come fare un upload di un file zip e decomprimerlo in una directory in php

Vorrei fare un upload di un file compresso zip, creare una directory univoca e decomprimerlo al suo interno con un click

Come fare?

-

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()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";
            }
        }
    }

 

 


   
Php
   


Lascia un commento