Slik åpner du zip-filer med PHP

ThemeForest har en fin funksjon; Det tillater forfatterne å laste opp zip-filer som inneholder skjermbilder av deres temaer. Et skript trekker deretter ut disse filene og viser bildene tilsvarende. Selv om jeg tviler på at utviklerne brukte PHP til å utføre denne oppgaven ... det er det vi skal bruke!


Hva vi må gjøre

  • Opprett et enkelt opplastingsskjema som lar brukeren velge en zip-fil.
  • Kontroller at brukeren velger en zip-fil, og lagre den som en unik fil.
  • Ekstra innholdet fra zip-filen og lagre dem i en bestemt mappe.
  • Slett zip-filen og ekko innholdet.

Trinn 1: Opprette opplastingsskjemaet

  • Opprett en ny fil og lagre den som index.html i roten til løsningen.
  • Deretter skal vi bygge en enkel form. Lim inn følgende.
 

Når du vil tillate at brukerne laster opp filer, må du sette "enctype" på skjemaetiketten lik "Multipart / formdata". Vi stiller deretter handlingen lik den samme siden, og metoden er lik posten.

For å holde ting som barebones som mulig, har vi bare en filinngang og en sende-knapp. Legg merke til at vi har satt navnet på filinngangen til "fupload". Vi vil snart bruke denne verdien for å avgjøre hvorvidt siden har postet tilbake.

Trinn 2: Skrive PHP

Øverst på siden index.php, før doktypen er blitt deklarert, lim inn i følgende:

  

La oss ta det trinnvis.

  • Hvis inntagsmerket med et navn "fupload" er satt, kjør du følgende kode, ellers gjør ingenting.
  • Nå må vi lage noen få variabler. Vi må fange navnet på filen lastet opp, katalogen der filen er midlertidig lagret, og hvilken type fil som ble valgt.

La oss anta at en bruker velger en fil som heter "myPics.zip".

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = noen midlertidig katalog på serveren.
  • $ _FILES ['fupload'] ['type'] = "application / zip". (Denne verdien kan endres avhengig av hvilken nettleser filen ble lastet opp fra.

La oss da eksplodere filnavnet i to deler: navnet og utvidelsen.

 $ name = explode ('.', $ filnavn); $ target = 'extracted /'. $ navn [0]. '-'. tid() . '/';

Fortsetter med vårt eksempel "myPics.zip" -fil - $ navn [0] vil likne "myPics". $ navn [1] vil likne "zip".

Deretter oppretter vi en ny variabel kalt "$ target". Dette blir stedet du lagret filen vår. For å sikre at en annen bruker med det samme "myPics" -navnet ikke har overskrevet sine filer, må vi sørge for at vi lagrer filene til et unikt sted. For å utføre denne oppgaven, implementerer vi funksjonen "tid ()". Hvis vi legger til denne verdien til navnet på den opplastede filen, kan vi være sikre på at vi vil ende opp med et unikt mappenavn!

$ target = "extracted / myPics-02151985 /"

Trinn 3: Kontroller at en zip-fil ble valgt

Umiddelbart etter din $ target-variabel, lim inn i følgende:

 $ accepted_types = array ('application / zip', 'application / x-zip-komprimert', 'multipart / x-zip', 'application / s-compressed'); foreach ($ accepted_types as $ mime_type) if ($ mime_type == $ type) $ okay = true; gå i stykker; 
  • Vi starter med å opprette en gruppe som heter $ accepted_types. Et raskt Google-søk etter "zip mime typer" vil gi oss fire verdier: 'applikasjon / zip-komprimert', 'multipart / x-zip', 'applikasjon / s-komprimert'. Hver nettleser har sin egen måte å registrere filtypen på. Vi må være sikker på å sjekke hver verdi i slike tilfeller.
  • For å gjøre dette, ser vi om noen av elementene i vårt array har samme verdi som "$ _FILES ['fupload'] ['type']". Hvis de gjør det, vil vi sette vår handy-dandy "$ okay" -variabel lik «true» - og kan bryte seg ut av «for» -oppgaven og være trygg på at brukeren faktisk har valgt en zip-fil.

Dessverre registrerer Safari og Chrome ikke en type for zip-filer. Dette skaper et problem for oss. Etter litt forskning kunne jeg ikke finne en enkel løsning - uten å bruke en forlengelse (PEAR). I stedet vil vi sørge for at filnavnet i hvert fall ender i "zip". Det bør bemerkes at dette ikke er 100% trygt. Hva om brukeren lastet opp en annen filtype som endte i "zip"? Gi gjerne anbefalinger! :)

 $ okay = strtolower ($ name [1]) == 'zip'? sant: false;
  • Vi bruker den ternære operatøren for å holde denne utsagnet ned til en linje. Hvis utvidelsen av filnavnet ($ navn [1]) er lik «zip», setter vi $ ok til true. Ellers vil det være lik «falsk».

Deretter sjekker vi for å se om $ okay er feil. Hvis det er, vet vi at en "zip" -fil ikke ble valgt. I slike tilfeller vil vi fortelle PHP å dø.

 hvis (! $ ok) die ("Vennligst velg en zip-fil, dummy!"); 

Trinn 4: Lagre zip-filen

 mkdir ($ target); $ saved_file_location = $ target. $ Filnavn; hvis (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  ellers die ("Det var et problem. Beklager!"); 
  • Vi må først opprette katalogen som vi refererte til med vår $ målvariabel. Dette kan enkelt gjøres ved å bruke "mkdir" -funksjonen.
  • Deretter prøver vi å flytte den opplastede filen, fra den midlertidige katalogen, til vår $ målkatalog. Hvis denne prosedyren ble utført, kaller vi "openZip" -funksjonen.

Trinn 5: funksjonen openZip ()

Opprett en ny side og lagre den som "functions.php". Legg nå følgende kode:

 åpen ($ file_to_open); hvis ($ x === true) $ zip-> extractTo ($ target); $ Zip> close (); koble fra ($ file_to_open);  else die ("Det oppstod et problem. Vennligst prøv igjen!"); ?>

Denne funksjonen vil akseptere en parameter: $ file_to_open. Denne parameteren vil inneholde plasseringen av zip-filen som vi prøver å trekke ut!

  • For å bruke klassen ZipArchive () må du først forsikre deg om at du aktiverer 'php_zip.dll' i filen "php.ini". Bare søk etter den strengen, og fjern deretter semikolon.
  • Med hvilken som helst klasse må vi opprette en ny forekomst av objektet. Vi kaller den "åpne" metoden og sender inn plasseringen av filen som skal åpnes. Hvis det utføres vellykket, returnerer denne metoden "true". Hvis det er tilfelle, vil vi trekke ut innholdet i zip-filen til en mappe. Vi har allerede opprettet banen til denne mappen når vi opprettet vår $ målvariabel. (Merk - For å få tilgang til variabelen må du legge til "global" foran variabelen. Dette vil fortelle PHP å gå utenfor den gjeldende funksjonen og søke etter $ target-variabelen.).
  • Når filene er hentet, sletter vi zip-filen - siden vi ikke lenger trenger det!

Husk - vi har opprettet vår nye 'functions.php' -fil, men vi må inkludere det! Legg til følgende øverst på siden 'index.php', like etter åpningen av PHP-taggen.

 require_once 'functions.php';

Ekko innholdet

Det vi har så langt fungerer perfekt! Men for å gi deg litt tilbakemelding, la oss skanne den nye katalogen og ekko innholdet. Du bør slette denne neste kodeblokken fra prosjektet ditt. Det er bare for testing. Hvis du vil beholde det, ekko informasjonen ut i kroppsmerket.

 $ scan = scandir ($ target. $ navn [0]); skrive ut '
    '; for ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); hvis ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; annet echo '
  • '. $ scan [$ i]. '
  • '; skrive ut '
';

Jeg vil ikke gå over denne siste delen for mye - det er unødvendig. Men hvis du ønsker en fullstendig forklaring, pass på å se den tilhørende skjermbildet! For å oppsummere det, skanner dette siste skriptet vår nye katalog og ekkoer ut en uordnet liste som inneholder innholdet.

ferdig

Ikke for vanskelig, eh? Det er en pen funksjon som enkelt kan implementeres i prosjektene dine. Hva er tankene dine om sikkerhet når det gjelder å laste opp zip-filer? Hvordan kan vi være sikre på at innholdet i zip-filen ikke er skadelig? Jeg vil gjerne høre alles mening om disse sikkerhetsimplikasjonene. Hvis ikke håndtert riktig, kan en hacker forårsake alvorlig skade på serveren din. La oss diskutere det! Det er mulig å søke etter farlige filtyper (.htaccess-filer) og slette dem.

Den endelige indeksen.php-siden

 '; for ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); hvis ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; annet echo '
  • '. $ scan [$ i]. '
  • '; skrive ut ''; ?> Slik laster du opp og åpner zip-filer med PHP

    Last opp en zip-fil


    • Abonner på NETTUTS RSS-feed for flere daglige webutviklinger og artikler.