Hur Zip och Unzip-filer i PHP

Att komprimera filer när de överförs via internet har många fördelar. I de flesta fall kommer den sammanlagda totala storleken på alla filer i komprimerat format att komma ner med en bra marginal. Det innebär att du sparar lite av din bandbredd, och användare får också snabbare nedladdningshastigheter. När användarna har laddat ner en fil kan de dekomprimeras när de vill. Kort sagt, komprimering kan göra att betjäna filer över internet mycket enklare för dig och dina besökare.

En faktor som kan avskräcka dig från att komprimera filer eller göra processen mycket tröttsam är att du kanske gör det manuellt. Lyckligtvis kommer PHP med många tillägg som specifikt handlar om filkomprimering och extraktion. Du kan använda funktionerna som finns i dessa tillägg för att automatiskt komprimera filer i PHP.

Denna handledning kommer att lära dig hur du zip och unzip (komprimera och extrahera) filer till och från ett zip-arkiv i PHP. Du kommer också att lära dig hur du raderar eller byter namn på filer i ett arkiv utan att extrahera dem först.

Komprimera filer i PHP

PHP ZipArchive klassen har många egenskaper och metoder som kan hjälpa dig att komprimera och dekomprimera alla dina filer.

Komprimera enskilda filer

Du kan lägga till filer i ditt zip-arkiv en i taget eller lägga till hela katalogen på en gång. I båda fallen skapar det första steget ett nytt ZipArchive exempel och sedan ringa öppna ($ filnamn, [$ flaggor]) metod. Den här metoden öppnar ett nytt zip-arkiv för läsning, skrivning eller andra ändringar. Det finns fyra giltiga värden för den frivilliga $ flagga parameter som bestämmer hur man hanterar olika situationer.

  • ZipArchive :: SKRIV ÖVER-Den här flaggan skriver över innehållet i det angivna arkivet om det redan finns.
  • ZipArchive :: SKAPA-Den här flaggan skapar ett nytt arkiv om det inte redan existerar.
  • ZipArchive :: EXCL-Den här flaggan resulterar i ett fel om arkivet redan finns.
  • ZipArchive :: CHECKCONS-Denna flagga kommer att berätta för PHP att utföra ytterligare konsekvenskontroller i arkivet och ge ett fel om de misslyckas.

Du kan kontrollera dokumentationen för den här metoden för att lära dig om olika felkoder som returneras vid fel på att öppna filen. Om zip-filen öppnades eller skapades framgångsrikt returneras metoden Sann.

När du väl har öppnat arkivet framgångsrikt kan du använda addFile ($ filnamn, $ lokala namn, $ start, $ längd) Metod för att lägga till en fil från en given sökväg till ditt arkiv. De $ filnamn parameter är sökvägen till en fil som du vill lägga till i arkivet. De $ localname parameter används för att tilldela ett namn till filen för att lagra det i arkivet. Du kan ringa Lägg till fil() varje gång du vill lägga till en ny fil i ditt arkiv.

Efter att du har lagt till alla nödvändiga filer i arkivet kan du helt enkelt ringa stänga() Metod för att stänga det och spara ändringarna.

Låt oss säga att du har en webbplats som låter användare hämta fontfiler för olika teckensnitt tillsammans med licensinformationen för att använda dem. Filer som dessa kommer att vara perfekta exempel på automatisk arkivering med hjälp av PHP. Följande kod visar hur du gör exakt det.

öppen ('komprimerad / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('teckensnitt / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('teckensnitt / Monoton / OFL.txt', 'license.txt'); $ Zip-> close (); ?>

Vi börjar med att skapa en ZipArchive exempel och sedan använda öppna() metod för att skapa vårt arkiv. De Lägg till fil() metod lägger till vår faktiska .ttf typsnitt fil och .Text licensfil till arkivet.

Du bör notera att originalfilerna var inuti teckensnitt / monoton katalogen. Men PHP-koden placerar den direkt inuti vårt arkiv. Du kan ändra katalogstrukturen såväl som namnen på filer som går i arkivet.

Komprimera flera filer från en katalog

Lägga till enskilda filer i ditt arkiv kan bli tröttsamt efter ett tag. Du kan till exempel skapa ett arkiv av alla .pdf eller .png filer i en katalog. De addGlob ($ mönster, $ flaggor, $ alternativ) Metoden kommer att visa sig mycket till hjälp i det här fallet. Den enda nackdelen med den här metoden är att du förlorar kontroll över placeringen av enskilda filer i arkivet. Du kan dock fortfarande påverka katalogstrukturen i arkivet med hjälp av $ alternativ parameter. Alternativen skickas i form av en associativ array.

  • add_path-Värdet du tilldelar add_path är prefixad till den lokala sökvägen för filen i arkivet.
  • remove_path-Värdet du tilldelar remove_path används för att ta bort ett matchande prefix från sökvägen för olika filer som läggs till i arkivet.
  • remove_all_path-Ställ in värdet på remove_all_path till Sann kommer att ta bort allt från sökvägen för filen förutom sitt namn. I det här fallet läggs filerna till arkivets rota.

Det är viktigt att komma ihåg att borttagning av en sökväg är klar innan du prefixar det värde som anges i add_path.

Följande kodbit kommer att använda addGlob () och alla dessa alternativ tydligare.

$ zip = ny ZipArchive (); $ zip-> open ('compressed / user_archive.zip', ZipArchive :: CREATE); $ options = array ('add_path' => 'light_wallpapers /', 'remove_all_path' => TRUE); $ zip-> addGlob ('lights / *. jpg', 0, $ options); $ options = array ('add_path' => 'font_files /', 'remove_all_path' => TRUE); $ zip-> addGlob ('dokument / *. ttf', 0, $ alternativ); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('dokument / * .pdf', 0, $ alternativ); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('dokument / *. jpg, png', GLOB_BRACE, $ alternativ); $ Zip-> close ();

Som vanligt börjar vi med att skapa en ZipArchive exempel och använd sedan öppna() metod för att skapa vårt arkiv. Vi anger också olika värden för add_path nyckel i $ alternativ array varje gång innan du ringer till addGlob () metod. På detta sätt kan vi hantera en specifik uppsättning filer i taget och ge arkiveringsalternativen i enlighet med detta.

I det första fallet lukar vi över allt .jpg filer i lampor katalog och placera dem i light_wallpapers katalog i arkivet. På samma sätt vierar vi över alla .ttf filer i dokument katalog och placera dem sedan i en mapp som heter font_files i vårt arkiv. Slutligen vierar det över alla .jpg och .png filer i våra dokument på en gång och sätta dem alla tillsammans i bilder katalog.

Som du kan se, värdena i $ alternativ Parametern är användbar för att organisera innehållet i arkivet.

Extrahera innehåll från ett arkiv

De ZipArchive klassen har en metod kallad extractTo ($ destination, $ entries) att extrahera innehållet i ett arkiv Du kan använda den för att antingen extrahera allt inne i arkivet eller bara några specifika filer. De $ poster parameter kan användas för att ange ett enda filnamn som ska extraheras, eller du kan använda det för att skicka en rad filer.

En viktig punkt att komma ihåg är att du måste ange rätt väg för filen i arkivet för att extrahera den. Till exempel arkiverade vi en fontfil som heter AlegreyaSans-Light.ttf i föregående avsnitt. Filen lagrades i arkivet i en katalog som heter font_files. Det betyder att sökvägen du behöver ange i $ poster parameter skulle vara font_files / AlegreyaSans-Light.ttf och inte helt enkelt AlegreyaSans-Light.ttf.

Katalog- och filstrukturen bevaras under utvinningsprocessen, och filer kommer att extraheras i respektive katalog.

öppen ('komprimerad / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ Zip-> close (); ?>

Om du släpper bort den andra parametern kommer metoden att extrahera alla filer i arkivet.

Få mer kontroll över arkiven

De ZipArchive klassen har också många andra metoder och egenskaper som hjälper dig att få mer information om arkivet innan du tar ut hela innehållet.

Du kan räkna antalet filer i ett arkiv med hjälp av räkna() metod. Ett annat alternativ är att använda numfiles fast egendom. De kan användas för att iterera över alla filer i arkivet och bara extrahera dem du behöver - eller du kan göra något annat med dem, som att ta bort dem från arkivet.

I följande exempel raderar vi alla filer i arkivet som innehåller ordet Kursiv. Liknande kod kan användas för att radera alla filer som inte innehåller ett visst ord. Du kan också iterera över dessa filer och ersätta ett visst ord med något annat.

öppen ('komprimerad / user_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); för ($ i = 0; $ i < $file_count; $i++)  $file_name = $zip->getNameIndex ($ i); om (stripos ($ file_name, 'Italic')! == false) $ zip-> deleteName ($ file_name);  $ zip-> nära (); ?>

I ovanstående kod använder vi deleteName () att radera en enskild fil. Du kan dock också använda den för att radera en hel katalog.

En liknande funktion byt namn ($ förnamn, $ nynamn) kan användas för att ändra namnet på alla filer i arkivet. Du kommer att få ett fel om en fil med titeln $ newname existerar redan.

Slutgiltiga tankar

Vi har täckt en massa mycket användbara metoder för ZipArchive klass som kommer att göra automatiserad komprimering och extraktion av filer i PHP en bris. Du ska nu kunna komprimera enskilda filer eller en grupp av dem på en gång, baserat på dina egna kriterier. På samma sätt borde du kunna extrahera en viss fil från arkivet utan att påverka annat innehåll.

Med hjälp av räkna() och numfiles, Du kommer att få större kontroll över de enskilda filerna, och omdirigering eller radering av dem skulle vara super lätt. Du bör gå igenom dokumentationen minst en gång för att läsa om fler sådana funktioner.