La gestione dei file zip in PHP: creiamo un archivio al volo

PHP dispone di una classe che consente la gestione dei file ZIP senza alcuna difficoltà. Vediamo un esempio del suo utilizzo! Qui la documentazione

Immaginiamo di avere una pagina di download, di voler consentire all’utente di scegliere i file da scaricare e di volergli dare i file scelti in un unico file compresso.
Questo potrebbe essere utile, per esempio, se decidessimo di distribuire un nostro programma con dei componenti opzionali da far scegliere all’utente.
Con l’aiuto di un form e della classe in questione possiamo realizzare in modo semplice la nostra pagina di download.

Ecco il codice. I file sono due: index.html, da cui l’utente sceglierà i file da scaricare e download.php, che crea il file e lo spedisce all’utente stesso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!------------------- index.html ------------------->
<html>
  <head>
    <title>Downloads</title>
  </head>
  <body>
    <p><b>Scegli i file da scaricare!</b></p>
    <form action="download.php" method="post">
      <label for="file1">File1</label>
      <input type="checkbox" id="file1" name="file1" /><br />
      <label for="file2">File2</label>
      <input type="checkbox" id="file2" name="file2" /><br />
      <label for="file3">File3</label>
      <input type="checkbox" id="file3" name="file3" /><br />
      <input type="submit" id="download_files" name="download_files" value="Scarica" />
    </form>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
  /*************** download.php ************************/
 
  // Disattiviamo tutti gli errori. Anche se dopo puliremo lo stream di output, meglio non lasciare che compaiano warning
  @error_reporting(0);
 
  $dir = 'zip_files/';
  if (is_writable($dir)){
    //Generiamo un nome file casuale per il file ZIP
    do{
      $filename = mt_rand() . '.zip';
    }while(file_exists($dir . $filename));
    //Creazione di un oggetto ZipArchive
    $zipfile = new ZipArchive();
    //Creazione del file ZIP
    $zipfile->open($dir . $filename, ZIPARCHIVE::CREATE);
    //Controlliamo se il file è stato creato
    if ($zip->status != ZIPARCHIVE::ER_OK) {
      exit("Impossibile scrivere il file zip");
    }
    //Aggiungiamo un file di licenza, questo file sarà sempre presente
   //Il secondo parametro non è obbligatorio, serve solo a evitare la creazione della sottocartella files all'interno dell'archivio
    $zipfile->addFile('files/licenze.txt', 'licenze.txt');
    //Se è stato selezionato il file 1 lo aggiungiamo
    if (isset($_POST['file1']))
      $zipfile->addFile('files/file1.txt', 'file1.txt');
    //E così via per gli altri due
    if (isset($_POST['file2']))
      $zipfile->addFile('files/file2.txt', 'file2.txt');
    if (isset($_POST['file3']))
      $zipfile->addFile('files/file3.txt', 'file3.txt');
    //Chiudiamo l'archivio
    $zipfile->close();
 
    //Alcuni header che indicheranno il contenuto del file. Sono necessari perché la pagina generi un download
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=yourfiles.zip');
    header('Content-Transfer-Encoding: binary');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Length: ' . filesize($dir . $filename));
    //Puliamo l'output della pagina. Anche un solo carattere di troppo renderebbe illeggibile il file!
    ob_clean();
    flush();
    //Output del file ZIP
    @readfile($dir . $filename);
    //Eliminazione del file ZIP, ora non serve più
    @unlink($dir . $filename);
    exit;
  }else{
    exit("Directory $dir non scrivibile");
  }
?>

Semplice, no? Se volete provarlo, l’esempio è già testato. Dovrete creare una directory files e metterci i file file1.txt, file2.txt, file3.txt e licenze.txt. Inoltre servirà un’ulteriore directory zip_files, usata per creare il file da spedire all’utente. Come vedete, è tutto molto semplice, i commenti ci sono e non occorrono altre spiegazioni.

[Voti: 0   Media: 0/5]
Questo articolo è stato pubblicato in PHP da Alex . Aggiungi il permalink ai segnalibri.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *