Hoe Zip-bestanden te openen met PHP

ThemeForest heeft een leuke functie; Hiermee kunnen de auteurs zip-bestanden uploaden met schermafbeeldingen van hun thema's. Vervolgens extraheert een script deze bestanden en geeft de afbeeldingen dienovereenkomstig weer. Hoewel ik betwijfel of de ontwikkelaars PHP hebben gebruikt om deze taak te volbrengen ... dat is wat we gaan gebruiken!


Wat we moeten doen

  • Maak een eenvoudig uploadformulier waarmee de gebruiker een zipbestand kan selecteren.
  • Zorg ervoor dat de gebruiker een zipbestand kiest en sla het op als een uniek bestand.
  • Pak de inhoud uit het zipbestand en sla ze op in een specifieke map.
  • Verwijder het zipbestand en echo de inhoud.

Stap 1: Het uploadformulier maken

  • Maak een nieuw bestand en sla het op als index.html in de root van uw oplossing.
  • Vervolgens bouwen we een eenvoudig formulier. Plak het volgende in.
 

Elke keer dat u uw gebruikers toestaat om bestanden te uploaden, moet u het "enctype" van de formuletag gelijk maken "Multipart / form-data". Vervolgens stellen we de actie gelijk aan dezelfde pagina en de methode gelijk aan plaatsen.

Om dingen zo barebones mogelijk te houden, hebben we alleen een bestandsinvoer en een verzendknop. Merk op dat we de naam van de invoer van het bestand hebben ingesteld op "fupload". We zullen deze waarde binnenkort gebruiken om te bepalen of de pagina is teruggeplaatst.

Stap 2: De PHP schrijven

Helemaal boven aan uw index.php-pagina, voordat het doctype is gedeclareerd, plakt u het volgende:

  

Laten we het stap voor stap doen.

  • Als de invoertag met een naam "fupload" is ingesteld, voer dan de volgende code uit, anders niets doen.
  • Nu moeten we een paar variabelen maken. We moeten de naam van het geüploade bestand vastleggen, de map waarin het bestand tijdelijk is opgeslagen en het type bestand dat is gekozen.

Laten we aannemen dat een gebruiker een bestand kiest met de naam "myPics.zip".

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = een tijdelijke map op de server.
  • $ _FILES ['fupload'] ['type'] = "applicatie / zip". (Deze waarde kan veranderen afhankelijk van de browser van waaruit het bestand is geüpload.

Laten we vervolgens de bestandsnaam in twee delen exploderen: de naam en de extensie.

 $ name = explode ('.', $ filename); $ target = 'removed /'. $ naam [0]. '-'. tijd (). '/';

Verdergaand met ons voorbeeld "myPics.zip" bestand - $ naam [0] is gelijk aan "myPics". $ naam [1] is gelijk aan "zip".

Vervolgens maken we een nieuwe variabele genaamd "$ target". Dit is de locatie waar ons bestand wordt opgeslagen. Om ervoor te zorgen dat een andere gebruiker met dezelfde 'myPics'-naam zijn bestanden niet overschrijft, moeten we ervoor zorgen dat we de bestanden opslaan op een unieke locatie. Om deze taak te volbrengen, implementeren we de "time ()" -functie. Als we deze waarde toevoegen aan de naam van het geüploade bestand, kunnen we er zeker van zijn dat we eindigen met een unieke mapnaam!

$ target = "extraction / myPics-02151985 /"

Stap 3: Zorg dat een zipbestand is geselecteerd

Meteen na uw $ doelvariabele plakt u het volgende:

 $ accepted_types = array ('application / zip', 'application / x-zip-gecomprimeerd', 'multipart / x-zip', 'application / s-compressed'); foreach ($ accepted_types als $ mime_type) if ($ mime_type == $ type) $ okay = waar; breken; 
  • We beginnen met het maken van een array genaamd $ accepted_types. Een snelle Google-zoekopdracht naar "zip mime types" brengt ons vier waarden: 'application / zip', 'application / x-zip-gecomprimeerd', 'multipart / x-zip', 'application / s-gecomprimeerd'. Elke browser heeft zijn eigen manier om het bestandstype te registreren. We moeten ervoor zorgen dat elke waarde in dergelijke gevallen wordt gecontroleerd.
  • Om dit te doen, controleren we om te zien of een van de items in onze array dezelfde waarde heeft als "$ _FILES ['fupload'] ['type']". Als dat het geval is, stellen we onze handig-dandy "$ okay" -variabele gelijk aan 'true' - en kunnen we de 'voor' -instructie doorbreken en er zeker van zijn dat de gebruiker in feite een zipbestand heeft gekozen.

Helaas registreren Safari en Chrome geen type voor zip-bestanden. Dit creëert een probleem voor ons. Na enig onderzoek was ik niet in staat om een ​​eenvoudige oplossing te vinden - zonder een extensie te gebruiken (PEAR). In plaats daarvan zorgen we ervoor dat de bestandsnaam ten minste eindigt in "zip". Opgemerkt moet worden dat dit niet 100% veilig is. Wat als de gebruiker een ander bestandstype uploadde dat eindigde in 'zip'? Aarzel niet om aanbevelingen te doen! :)

 $ okay = strtolower ($ naam [1]) == 'zip'? waar onwaar;
  • We zullen de ternaire operator gebruiken om deze verklaring op één regel te houden. Als de extensie van de bestandsnaam ($ naam [1]) gelijk is aan 'zip', stellen we $ oke in op true. Anders is het gelijk aan 'false'.

Vervolgens zullen we controleren of $ oke onjuist is. Als dat zo is, weten we dat er geen 'zip'-bestand is gekozen. In dergelijke gevallen vertellen we PHP om te sterven.

 if (! $ okay) die ("Kies een zip-bestand, dummy!"); 

Stap 4: Het zipbestand opslaan

 mkdir ($ doel); $ saved_file_location = $ target. $ Filename; if (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("Er was een probleem. Sorry!"); 
  • We moeten eerst de map maken waarnaar we hebben verwezen met onze $ doelvariabele. Dit kan eenvoudig worden gedaan met behulp van de "mkdir" -functie.
  • Laten we vervolgens proberen het geüploade bestand van de tijdelijke map naar onze $ doelmap te verplaatsen. Als die procedure met succes is uitgevoerd, noemen we de functie "openZip".

Stap 5: De functie openZip ()

Maak een nieuwe pagina en sla deze op als "functions.php". Voeg nu de volgende code toe:

 geopend ($ file_to_open); if ($ x === true) $ zip-> extractTo ($ target); $ Zip-> close (); ontkoppelen ($ file_to_open);  else die ("Er was een probleem. Probeer het opnieuw!"); ?>

Deze functie accepteert één parameter: $ file_to_open. Deze parameter bevat de locatie van het zipbestand dat we proberen uit te pakken!

  • Om de klasse ZipArchive () te gebruiken, moet u eerst zorgen dat 'php_zip.dll' in uw "php.ini" -bestand wordt ingeschakeld. Zoek eenvoudig naar die reeks en verwijder de puntkomma.
  • Met elke klasse moeten we een nieuw exemplaar van het object maken. Vervolgens bellen we de methode "open" en geven we de locatie door van het bestand dat moet worden geopend. Als deze methode met succes wordt uitgevoerd, retourneert deze methode 'waar'. Als dat het geval is, extraheren we de inhoud van het zipbestand naar een map. We hebben het pad naar deze map al gemaakt toen we onze $ doelvariabele maakten. (Opmerking - Om toegang tot die variabele te krijgen, moet u "global" voor de variabele toevoegen. Dit zal PHP vertellen om buiten de huidige functie te gaan en te zoeken naar de $ doelvariabele.).
  • Nadat de bestanden zijn uitgepakt, zullen we het zipbestand verwijderen - omdat we het niet langer nodig hebben!

Denk eraan - we hebben ons nieuwe 'functions.php'-bestand gemaakt, maar we moeten het opnemen! Voeg het volgende toe bovenaan uw 'index.php'-pagina, net na de eerste PHP-tag.

 require_once 'functions.php';

In navolging van de inhoud

Wat we tot nu toe hebben gedaan, werkt perfect! Maar laten we, om u feedback te geven, de nieuwe map scannen en de inhoud uitlezen. U moet dit volgende codeblok uit uw project verwijderen. Het is alleen voor testen. Als je het wel wilt behouden, herhaal dan de informatie in de body-tag.

 $ scan = scandir ($ doel. $ naam [0]); print '
    '; voor ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); if ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; else echo '
  • '. $ scan [$ i]. '
  • '; afdrukken '
';

Ik zal dit laatste deel niet te veel bespreken - omdat het niet nodig is. Als u echter een volledige uitleg wilt, let dan op de bijbehorende screencast! Om snel op te tellen, scant dit laatste script onze nieuwe map en echoot een ongeordende lijst met de inhoud.

Afgewerkt

Niet te moeilijk, toch? Het is een handige functie die eenvoudig in uw projecten kan worden geïmplementeerd. Wat zijn uw mening over beveiliging als het gaat om het uploaden van zip-bestanden? Hoe kunnen we er zeker van zijn dat de inhoud van het zipbestand niet schadelijk is? Ik zou graag ieders mening horen over deze veiligheidsimplicaties. Als een hacker niet correct wordt behandeld, kan dit uw server ernstig schaden. Laten we het bespreken! Het is mogelijk om te zoeken naar gevaarlijke bestandstypen (. Htaccess-bestanden) en deze te verwijderen.

De laatste index.php pagina

 '; voor ($ i = 0; $ i= 3) $ check_for_html_doc = strpos ($ scan [$ i], 'html'); $ check_for_php = strpos ($ scan [$ i], 'php'); if ($ check_for_html_doc === false && $ check_for_php === false) echo '
  • '. $ scan [$ i]. '
  • '; else echo '
  • '. $ scan [$ i]. '
  • '; afdrukken ''; ?> Hoe zip-bestanden uploaden en openen met PHP

    Upload een zipbestand


    • Abonneer u op de NETTUTS RSS-feed voor meer dagelijkse webontwikkelingen, tuts en artikelen.