{"id":230,"date":"2011-11-19T19:47:21","date_gmt":"2011-11-19T18:47:21","guid":{"rendered":"http:\/\/localhost\/blog\/?p=230"},"modified":"2012-12-29T22:16:01","modified_gmt":"2012-12-29T21:16:01","slug":"la-gestione-dei-file-zip-in-php-creiamo-un-archivio-al-volo","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=230","title":{"rendered":"La gestione dei file zip in PHP: creiamo un archivio al volo"},"content":{"rendered":"<p>PHP dispone di una classe che consente la gestione dei file ZIP senza alcuna difficolt\u00e0. Vediamo un esempio del suo utilizzo!<!--more--> <a href=\"http:\/\/it2.php.net\/manual\/en\/class.ziparchive.php\">Qui la documentazione<\/a><\/p>\n<p>Immaginiamo di avere una pagina di download, di voler consentire all&#8217;utente di scegliere i file da scaricare e di volergli dare i file scelti in un unico file compresso.<br \/>\nQuesto potrebbe essere utile, per esempio, se decidessimo di distribuire un nostro programma con dei componenti opzionali da far scegliere all&#8217;utente.<br \/>\nCon l&#8217;aiuto di un form e della classe in questione possiamo realizzare in modo semplice la nostra pagina di download.<\/p>\n<p>Ecco il codice. I file sono due: index.html, da cui l&#8217;utente sceglier\u00e0 i file da scaricare e download.php, che crea il file e lo spedisce all&#8217;utente stesso.<\/p>\n<pre lang=\"html\" line=\"1\">\r\n<!------------------- index.html ------------------->\r\n<html>\r\n  <head>\r\n    <title>Downloads<\/title>\r\n  <\/head>\r\n  <body>\r\n    <p><b>Scegli i file da scaricare!<\/b><\/p>\r\n    <form action=\"download.php\" method=\"post\">\r\n      <label for=\"file1\">File1<\/label>\r\n      <input type=\"checkbox\" id=\"file1\" name=\"file1\" \/><br \/>\r\n      <label for=\"file2\">File2<\/label>\r\n      <input type=\"checkbox\" id=\"file2\" name=\"file2\" \/><br \/>\r\n      <label for=\"file3\">File3<\/label>\r\n      <input type=\"checkbox\" id=\"file3\" name=\"file3\" \/><br \/>\r\n      <input type=\"submit\" id=\"download_files\" name=\"download_files\" value=\"Scarica\" \/>\r\n    <\/form>\r\n  <\/body>\r\n<\/html>\r\n<\/pre>\n<pre lang=\"PHP\" line=\"1\">\r\n<?php\r\n  \/*************** download.php ************************\/\r\n\r\n  \/\/ Disattiviamo tutti gli errori. Anche se dopo puliremo lo stream di output, meglio non lasciare che compaiano warning\r\n  @error_reporting(0);\r\n \r\n  $dir = 'zip_files\/';\r\n  if (is_writable($dir)){\r\n    \/\/Generiamo un nome file casuale per il file ZIP\r\n    do{\r\n      $filename = mt_rand() . '.zip';\r\n    }while(file_exists($dir . $filename));\r\n    \/\/Creazione di un oggetto ZipArchive\r\n    $zipfile = new ZipArchive();\r\n    \/\/Creazione del file ZIP\r\n    $zipfile->open($dir . $filename, ZIPARCHIVE::CREATE);\r\n    \/\/Controlliamo se il file \u00e8 stato creato\r\n    if ($zip->status != ZIPARCHIVE::ER_OK) {\r\n      exit(\"Impossibile scrivere il file zip\");\r\n    }\r\n    \/\/Aggiungiamo un file di licenza, questo file sar\u00e0 sempre presente\r\n   \/\/Il secondo parametro non \u00e8 obbligatorio, serve solo a evitare la creazione della sottocartella files all'interno dell'archivio\r\n    $zipfile->addFile('files\/licenze.txt', 'licenze.txt');\r\n    \/\/Se \u00e8 stato selezionato il file 1 lo aggiungiamo\r\n    if (isset($_POST['file1']))\r\n      $zipfile->addFile('files\/file1.txt', 'file1.txt');\r\n    \/\/E cos\u00ec via per gli altri due\r\n    if (isset($_POST['file2']))\r\n      $zipfile->addFile('files\/file2.txt', 'file2.txt');\r\n    if (isset($_POST['file3']))\r\n      $zipfile->addFile('files\/file3.txt', 'file3.txt');\r\n    \/\/Chiudiamo l'archivio\r\n    $zipfile->close();\r\n\r\n    \/\/Alcuni header che indicheranno il contenuto del file. Sono necessari perch\u00e9 la pagina generi un download\r\n    header('Content-Type: application\/zip');\r\n    header('Content-Disposition: attachment; filename=yourfiles.zip');\r\n    header('Content-Transfer-Encoding: binary');\r\n    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');\r\n    header('Content-Length: ' . filesize($dir . $filename));\r\n    \/\/Puliamo l'output della pagina. Anche un solo carattere di troppo renderebbe illeggibile il file!\r\n    ob_clean();\r\n    flush();\r\n    \/\/Output del file ZIP\r\n    @readfile($dir . $filename);\r\n    \/\/Eliminazione del file ZIP, ora non serve pi\u00f9\r\n    @unlink($dir . $filename);\r\n    exit;\r\n  }else{\r\n    exit(\"Directory $dir non scrivibile\");\r\n  }\r\n?>\r\n<\/pre>\n<p>Semplice, no? Se volete provarlo, l&#8217;esempio \u00e8 gi\u00e0 testato. Dovrete creare una directory files e metterci i file file1.txt, file2.txt, file3.txt e licenze.txt. Inoltre servir\u00e0 un&#8217;ulteriore directory zip_files, usata per creare il file da spedire all&#8217;utente. Come vedete, \u00e8 tutto molto semplice, i commenti ci sono e non occorrono altre spiegazioni.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP dispone di una classe che consente la gestione dei file ZIP senza alcuna difficolt\u00e0. Vediamo un esempio del suo utilizzo!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-230","post","type-post","status-publish","format-standard","hentry","category-programmazione-php"],"views":112,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=230"}],"version-history":[{"count":3,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/230\/revisions"}],"predecessor-version":[{"id":270,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/230\/revisions\/270"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}