Så här öppnar du Zip-filer med PHP

ThemeForest har en bra funktion; Det tillåter författarna att ladda upp zip-filer som innehåller skärmdumpar av sina teman. Ett skript extraherar dessa filer och visar bilderna i enlighet därmed. Även om jag tvivlar på att utvecklarna använde PHP för att utföra den här uppgiften ... det är vad vi ska använda!


Vad vi måste göra

  • Skapa ett enkelt uppladdningsformulär som gör att användaren kan välja en zip-fil.
  • Kontrollera att användaren väljer en zip-fil och spara den som en unik fil.
  • Extrahera innehållet från zip-filen och spara dem till en specifik mapp.
  • Ta bort zip-filen och eko ut innehållet.

Steg 1: Skapa uppladdningsformuläret

  • Skapa en ny fil och spara den som index.html i roten till din lösning.
  • Sedan bygger vi en enkel form. Klistra in följande i.
 

När du vill tillåta dina användare att ladda upp filer måste du ställa in "enctype" på formtaggen lika med "Multipart / form-data". Vi ställer sedan åtgärden lika med samma sida, och metoden motsvarar inlägget.

För att behålla saker som bara ben, har vi bara en filinmatning och en inlämningsknapp. Observera att vi har satt namnet på filinmatningen till "fupload". Vi använder snart det här värdet för att avgöra om sidan har skrivit tillbaka eller inte.

Steg 2: Skriva PHP

Högst upp på din index.php-sida, innan doktypen har deklarerats, klistra in i följande:

  

Låt oss ta det steg för steg.

  • Om inmatningskoden med namnet "fupload" är inställt, kör sedan följande kod, annars gör ingenting.
  • Nu behöver vi skapa några variabler. Vi måste fånga namnet på den uppladdade filen, katalogen där filen är tillfälligt lagrad och typen av fil som valdes.

Låt oss anta att en användare väljer en fil som heter "myPics.zip".

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = någon tillfällig katalog på servern.
  • $ _FILES ['fupload'] ['typ'] = "application / zip". (Detta värde kan ändras beroende på vilken webbläsare filen laddades upp från.

Låt oss sedan explodera filnamnet i två delar: namnet och förlängningen.

 $ name = explodera ('.', $ filnamn); $ target = 'extraherad /'. $ namn [0]. '-'. tid (). '/';

Fortsätter med vårt exempel "myPics.zip" -fil - $ namn [0] kommer att motsvara "myPics". $ namn [1] kommer att motsvara "zip".

Därefter skapar vi en ny variabel som heter "$ target". Detta blir den plats som vår fil sparas på. För att säkerställa att en annan användare med samma "myPics" -namn inte har skrivit över sina filer måste vi se till att vi sparar filerna till en unik plats. För att uppnå denna uppgift, implementerar vi funktionen "tid ()". Om vi ​​lägger till det här värdet på namnet på den uppladdade filen kan vi vara säkra på att vi kommer att sluta med ett unikt mappnamn!

$ target = "extraherade / myPics-02151985 /"

Steg 3: Se till att en zip-fil valdes

Omedelbart efter din $ målvariabel klistra in i följande:

 $ accepted_types = array ('application / zip', 'application / x-zip-compressed', 'multipart / x-zip', 'application / s-compressed'); foreach ($ accepted_types as $ mime_type) if ($ mime_type == $ typ) $ okay = true; ha sönder; 
  • Vi börjar med att skapa en array som heter $ accepted_types. En snabb Google-sökning efter "zip mime-typer" kommer att ge oss fyra värden: 'applikation / zip-komprimerad', 'multipart / x-zip', 'applikation / s-komprimerad'. Varje webbläsare har sitt eget sätt att registrera filtypen. Vi måste vara säkra på att kontrollera varje värde i sådana fall.
  • För att göra så kontrollerar vi om någon av föremålen i vår array har samma värde som "$ _FILES ['fupload'] ['typ']". Om de gör det ställer vi in ​​vår handy-dandy "$ okay" -variabel lika med "true" - och kan bryta sig ur "för" -förklaringen och vara säker på att användaren faktiskt har valt en zip-fil.

Tyvärr registrerar Safari och Chrome inte en typ för zip-filer. Detta skapar ett problem för oss. Efter lite forskning kunde jag inte hitta en enkel lösning - utan att använda en förlängning (PEAR). Istället ska vi se till att filnamnet åtminstone slutar i "zip". Det bör noteras att detta inte är 100% säkert. Vad händer om användaren laddar upp en annan filtyp som slutade i "zip"? Gärna ge rekommendationer! :)

 $ okay = strtolower ($ name [1]) == 'zip'? sant falskt;
  • Vi använder den ternära operatören för att hålla detta uttalande nere till en rad. Om förlängningen av filnamnet ($ namn [1]) är lika med "zip", ställer vi in ​​$ okej till sant. I annat fall kommer det att vara lika med "falskt".

Därefter kommer vi att kontrollera om $ okej är felaktigt. Om det är, vet vi att en zip-fil inte valdes. I sådana fall kommer vi att berätta för PHP att de ska dö.

 om (! $ okej) die ("Vänligen välj en zip-fil, dummy!"); 

Steg 4: Spara zip-filen

 mkdir ($ mål); $ saved_file_location = $ mål. $ Filnamn; om (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("Det var ett problem. Tyvärr!"); 
  • Vi behöver först skapa katalogen som vi hänvisade till med vår $ target-variabel. Detta kan enkelt göras med hjälp av funktionen "mkdir".
  • Låt oss sedan försöka flytta den uppladdade filen, från den tillfälliga katalogen, till vår $ målkatalog. Om det här förfarandet genomfördes lyckades vi kalla funktionen "openZip".

Steg 5: Funktionen openZip ()

Skapa en ny sida och spara den som "functions.php". Lägg nu till följande kod:

 open ($ file_to_open); om ($ x === true) $ zip-> extractTo ($ target); $ Zip-> close (); bort länken ($ file_to_open);  else die ("Det uppstod ett problem. Vänligen försök igen!"); ?>

Den här funktionen accepterar en parameter: $ file_to_open. Den här parametern innehåller placeringen av zip-filen som vi försöker extrahera!

  • För att använda klassen ZipArchive () måste du först försäkra dig om att aktivera "php_zip.dll" i din "php.ini" -fil. Sök bara efter den strängen och ta sedan bort semikolonet.
  • Med någon klass måste vi skapa en ny instans av objektet. Vi ringer nu "open" -metoden och skickar platsen i filen som ska öppnas. Om det görs framgångsrikt kommer denna metod att returnera "true". Om så är fallet tar vi ut innehållet i zip-filen till en mapp. Vi har redan skapat sökvägen till den här mappen när vi skapade vår $ målvariabel. (Obs! För att komma åt den variabeln måste du lägga till "global" framför variabeln. Detta kommer att berätta för PHP att gå utanför den aktuella funktionen och söka efter $ target-variabeln.).
  • När filerna har tagits ut tar vi bort zip-filen - eftersom vi inte längre behöver det!

Kom ihåg - vi har skapat vår nya "functions.php" -fil, men vi måste inkludera den! Lägg till följande på toppen av din "index.php" -sida, strax efter öppnande av PHP-taggen.

 require_once 'functions.php';

Echoing Innehållet

Det vi har hittills fungerar perfekt! Men för att ge dig lite återkoppling, låt oss skanna den nya katalogen och echo innehållet. Du bör ta bort det här koden från ditt projekt. Det är bara för testning. Om du vill behålla det, echo informationen ut i kroppslabeln.

 $ scan = scandir ($ target. $ namn [0]); skriva ut '
    '; för ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); om ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; annars echo '
  • '. $ scan [$ i]. '
  • '; skriv ut '
';

Jag kommer inte att gå över den här sista delen för mycket - eftersom det inte är nödvändigt. Men om du vill ha en fullständig förklaring, var noga med att titta på den tillhörande skärmbilden! För att snabbt summera upp det här skriptet skannar vår nya katalog och echos ut en oorderad lista innehållande innehållet.

Färdiga

Inte för hårt, va? Det är en snygg funktion som enkelt kan implementeras i dina projekt. Vad är dina tankar om säkerhet när det gäller att ladda upp zip-filer? Hur kan vi vara säkra på att innehållet i zip-filen inte är skadligt? Jag skulle gärna höra allas åsikter om dessa säkerhetsimplikationer. Om det inte hanteras ordentligt kan en hackare orsaka allvarliga skador på din server. Låt oss diskutera det! Det går att söka efter farliga filtyper (.htaccess-filer) och radera dem.

Den slutliga index.php-sidan

 '; för ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); om ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; annars echo '
  • '. $ scan [$ i]. '
  • '; skriv ut ''; ?> Så här laddar du upp och öppnar zip-filer med PHP

    Ladda upp en Zip-fil


    • Prenumerera på NETTUTS RSS-flödet för fler dagliga webbutvecklingstoppar och artiklar.