Komprimering av filer når de overføres over Internett har mange fordeler. I de fleste tilfeller kommer den samlede samlede størrelsen på alle filene i komprimert format ned med en fin margin. Dette betyr at du vil spare litt av båndbredden din, og brukerne får også raskere nedlastingshastigheter. Når brukerne har lastet ned en fil, kan de dekomprimeres når de vil. Kort sagt, komprimering kan gjøre betjening av filer over Internett mye enklere for deg og dine besøkende.
En faktor som kan motvirke deg fra å komprimere filer eller gjøre prosessen svært kjedelig, er at du kan gjøre det manuelt. Heldigvis kommer PHP med mange utvidelser som omhandler spesifikk filkomprimering og utvinning. Du kan bruke funksjonene som er tilgjengelige i disse utvidelsene, for automatisk å komprimere filer i PHP.
Denne opplæringen vil lære deg hvordan du zip og unzip (komprimere og pakke ut) filer til og fra et zip-arkiv i PHP. Du vil også lære å slette eller endre navn på filer i et arkiv uten å trekke dem ut først.
PHP ZipArchive
klassen har mange egenskaper og metoder som kan hjelpe deg med å komprimere og dekomprimere alle filene dine.
Du kan legge til filer i zip-arkivet en om gangen eller legge til hele katalogen samtidig. I begge tilfeller er det første trinnet å skape en ny ZipArchive
eksempel og deretter ringe åpne ($ filnavn, [$ flagger])
metode. Denne metoden åpner et nytt zip-arkiv for lesing, skriving eller andre modifikasjoner. Det er fire gyldige verdier for valgfritt $ flagg
parameter som bestemmer hvordan man skal håndtere forskjellige situasjoner.
ZipArchive :: OVERSKR
-Dette flagget overskriver innholdet i det angitte arkivet hvis det allerede eksisterer.ZipArchive :: CREATE
-Dette flagget vil opprette et nytt arkiv hvis det ikke allerede eksisterer.ZipArchive :: EXCL
-Dette flagget vil føre til en feil hvis arkivet allerede eksisterer.ZipArchive :: CHECKCONS
-Dette flagget vil fortelle PHP å utføre flere konsistenskontroller på arkivet og gi en feil hvis de feiler.Du kan sjekke dokumentasjonen for denne metoden for å få vite om forskjellige feilkoder som returneres i tilfelle feil å åpne filen. Hvis zip-filen ble åpnet eller opprettet, vil metoden returnere ekte
.
Når du har åpnet arkivet vellykket, kan du bruke addFile ($ filnavn, $ lokalt navn, $ start, $ lengde)
metode for å legge til en fil fra en gitt bane til arkivet ditt. De $ filnavn
parameteren er banen til en fil du vil legge til i arkivet. De $ localname
parameter brukes til å tilordne et navn til filen for å lagre det i arkivet. Du kan ringe Legg til fil()
hver gang du vil legge til en ny fil i arkivet ditt.
Etter at du har lagt til alle nødvendige filer i arkivet, kan du bare ringe Lukk()
metode for å lukke den og lagre endringene.
La oss si at du har et nettsted som lar brukerne laste ned skriftfiler for forskjellige skrifttyper sammen med lisensinformasjonen for å bruke dem. Filer som disse vil være perfekte eksempler på automatisert arkivering ved hjelp av PHP. Følgende kode viser deg hvordan du gjør akkurat det.
åpne ('komprimert / font_files.zip', ZipArchive :: CREATE); $ zip-> addFile ('skrifter / Monoton / Monoton-Regular.ttf', 'Monoton-Regular.ttf'); $ zip-> addFile ('skrifter / Monoton / OFL.txt', 'license.txt'); $ Zip> close (); ?>
Vi begynner med å lage en ZipArchive
eksempel og deretter bruke åpen()
metode for å lage vårt arkiv. De Legg til fil()
Metoden legger til vår faktiske .tTF fontfil og .tekst lisensfil til arkivet.
Du bør merke at de opprinnelige filene var inne i fonter / Monoton katalogen. Imidlertid plasserer PHP-koden den direkte inne i roten til vårt arkiv. Du kan endre katalogstrukturen så vel som navnene på filene som går i arkivet.
Å legge til individuelle filer i arkivet kan bli slitsomt etter en stund. For eksempel vil du kanskje lage et arkiv av alle .pdf eller .png filer i en katalog. De addGlob ($ mønster, $ flagger, $ alternativer)
Metoden vil vise seg veldig nyttig i dette tilfellet. Den eneste ulempen med denne metoden er at du mister kontroll over plasseringen av individuelle filer i arkivet. Du kan imidlertid fortsatt påvirke katalogstrukturen inne i arkivet ved hjelp av $ alternativer
parameter. Alternativene er bestått i form av en assosiativ array.
add_path
-Verdien du tildeler add_path
er prefiks til den lokale banen til filen i arkivet.remove_path
-Verdien du tildeler remove_path
brukes til å fjerne et tilsvarende prefiks fra banen til forskjellige filer som legges til arkivet.remove_all_path
-Angir verdien av remove_all_path
til ekte
vil fjerne alt fra stien til filen i tillegg til navnet sitt. I dette tilfellet legges filene til roten av arkivet.Det er viktig å huske at fjerning av en sti er ferdig før du prefixer verdien som er angitt i add_path
.
Følgende kodestykke vil gjøre bruk av addGlob ()
og alle disse alternativene klarere.
$ 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 ('dokumenter / *. ttf', 0, $ alternativer); $ options = array ('add_path' => 'pdf_books /', 'remove_all_path' => TRUE); $ zip-> addGlob ('dokumenter / * .pdf', 0, $ alternativer); $ options = array ('add_path' => 'images /', 'remove_all_path' => TRUE); $ zip-> addGlob ('dokumenter / *. jpg, png', GLOB_BRACE, $ alternativer); $ Zip> close ();
Som vanlig begynner vi med å skape en ZipArchive
forekomst og bruk deretter åpen()
metode for å lage vårt arkiv. Vi spesifiserer også forskjellige verdier for add_path
tast inn $ alternativer
array hver gang før du ringer til addGlob ()
metode. På den måten kan vi håndtere ett bestemt sett med filer om gangen og gi arkiveringsalternativer tilsvarende.
I det første tilfellet, vi iterate over alt .jpg filer i lys katalog og plasser dem i light_wallpapers katalog i arkivet. På samme måte, vi iterate over alle .tTF filer i dokumenter katalog og legg dem i en mappe som heter font_files i vårt arkiv. Til slutt, vi iterere over alle .jpg og .png filer i dokumentene på en gang og legg dem alle sammen i Bilder katalog.
Som du kan se, verdiene i $ alternativer
parameteren er nyttig for å organisere innholdet inne i arkivet.
De ZipArchive
klassen har en metode kalt extractTo ($ destinasjon, $ oppføringer)
å trekke ut innholdet i et arkiv. Du kan bruke den til å enten pakke ut alt inne i arkivet eller bare noen bestemte filer. De $ oppføringer
parameter kan brukes til å spesifisere et enkelt filnavn som skal utvinnes, eller du kan bruke det til å passere en rekke filer.
Et viktig poeng å huske er at du må spesifisere den riktige banen til filen inne i arkivet for å trekke den ut. For eksempel arkiverte vi en skriftfil som ble kalt AlegreyaSans-Light.ttf i den forrige delen. Filen ble lagret i arkivet i en katalog som heter font_files. Dette betyr at banen du må spesifisere i $ oppføringer
parameteren ville være font_files / AlegreyaSans-Light.ttf og ikke bare AlegreyaSans-Light.ttf.
Katalogen og filstrukturen vil bli bevart under utvinningsprosessen, og filene vil bli hentet ut i deres respektive kataloger.
åpne ('komprimert / user_archive.zip', ZipArchive :: CREATE); $ zip-> extractTo ('uncompressed /', 'font_files / AlegreyaSans-Light.ttf'); $ Zip> close (); ?>
Hvis du slipper ut den andre parameteren, vil metoden trekke ut alle filene i arkivet.
De ZipArchive
klassen har også mange andre metoder og egenskaper for å hjelpe deg med å få mer informasjon om arkivet før du trekker ut alt innholdet.
Du kan telle antall filer i et arkiv ved hjelp av telle()
metode. Et annet alternativ er å bruke numFiles
eiendom. De kan brukes til å iterere over alle filene i arkivet og bare trekke ut de du trenger - eller du kan gjøre noe annet med dem, som å fjerne dem fra arkivet.
I følgende eksempel sletter vi alle filer i arkivet som inneholder ordet kursiv. Lignende kode kan brukes til å slette alle filer som ikke inneholder et bestemt ord. Du kan også iterere over disse filene og erstatte et bestemt ord med noe annet.
åpne ('komprimert / user_archive.zip', ZipArchive :: CREATE); $ file_count = $ zip-> count (); for ($ i = 0; $ i < $file_count; $i++) $file_name = $zip->getNameIndex ($ i); hvis (stripos ($ file_name, 'Italic')! == false) $ zip-> deleteName ($ file_name); $ zip-> close (); ?>
I ovennevnte kode bruker vi deleteName ()
for å slette en individuell fil. Du kan imidlertid også bruke den til å slette en hel katalog.
En lignende funksjon endre navn ($ fornavn, $ nynavn)
kan brukes til å endre navnet på noen filer i arkivet. Du får en feil hvis en fil med tittelen $ newname
eksisterer allerede.
Vi har dekket en rekke svært nyttige metoder for ZipArchive
klasse som vil gjøre automatisert komprimering og utvinning av filer i PHP en bris. Du bør nå kunne komprimere individuelle filer eller en gruppe av dem samtidig, basert på dine egne kriterier. På samme måte bør du kunne trekke ut en bestemt fil fra arkivet uten å påvirke annet innhold.
Med hjelp av telle()
og numFiles
, du vil få mer kontroll over de enkelte filene, og omdøping eller sletning av dem ville være super enkelt. Du bør gå gjennom dokumentasjonen minst én gang for å lese om flere slike funksjoner.