Come aprire file zip con PHP

ThemeForest ha una bella funzionalità; Permette agli autori di caricare file zip contenenti screenshot dei loro temi. Uno script quindi estrae questi file e visualizza le immagini di conseguenza. Anche se dubito che gli sviluppatori abbiano usato PHP per svolgere questo compito ... questo è quello che useremo!


Cosa dobbiamo fare

  • Crea un semplice modulo di caricamento che consente all'utente di selezionare un file zip.
  • Assicurarsi che l'utente scelga un file zip e quindi salvarlo come un file univoco.
  • Estrai il contenuto dal file zip e salvalo in una cartella specifica.
  • Elimina il file zip ed echo i contenuti.

Passaggio 1: creazione del modulo di caricamento

  • Crea un nuovo file e salvalo come index.html nella radice della tua soluzione.
  • Successivamente, costruiremo un modulo semplice. Incolla quanto segue in.
 

Ogni volta che consentirai ai tuoi utenti di caricare file, devi impostare "enctype" del tag form uguale a "/ Form-data multipart". Successivamente imposteremo l'azione uguale alla stessa pagina e il metodo equivale a postare.

Per mantenere le cose come barebone possibile, abbiamo solo un input di file e un pulsante di invio. Nota che abbiamo impostato il nome del file in "fupload". Presto utilizzeremo questo valore per determinare se la pagina è stata postata o meno.

Passaggio 2: scrivere il PHP

Nella parte superiore della pagina index.php, prima che il doctype sia stato dichiarato, incollare quanto segue:

  

Facciamolo passo dopo passo.

  • Se il tag di input con il nome "fupload" è impostato, quindi eseguire il codice seguente, altrimenti non fare nulla.
  • Ora dobbiamo creare alcune variabili. Abbiamo bisogno di catturare il nome del file caricato, la directory in cui il file è temporaneamente archiviato e il tipo di file che è stato scelto.

Supponiamo che un utente scelga un file chiamato "myPics.zip".

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = una directory temporanea sul server.
  • $ _FILES ['fupload'] ['type'] = "application / zip". (Questo valore può variare a seconda del browser dal quale è stato caricato il file.

Quindi, esplodiamo il nome del file in due parti: il nome e l'estensione.

 $ name = explode ('.', $ nomefile); $ target = 'estratto /'. $ nome [0]. '-'. tempo() . '/';

Continuando con il nostro esempio "myPics.zip" file - $ nome [0] sarà uguale a "myPics". $ nome [1] sarà uguale a "zip".

Successivamente, creiamo una nuova variabile chiamata "$ target". Questa sarà la posizione in cui il nostro file è stato salvato. Per garantire che un utente diverso con lo stesso nome "myPics" non abbia i suoi file sovrascritti, dobbiamo assicurarci di salvare i file in una posizione univoca. Per realizzare questo compito, implementeremo la funzione "time ()". Se aggiungiamo questo valore al nome del file caricato, possiamo essere certi che avremo un nome di cartella univoco!

$ target = "estratto / myPics-02151985 /"

Passaggio 3: assicurarsi che sia stato selezionato un file zip

Subito dopo la variabile $ target, incolla quanto segue:

 $ accepted_types = array ('application / zip', 'application / x-zip-compressed', 'multipart / x-zip', 'application / s-compressed'); foreach ($ accepted_types as $ mime_type) if ($ mime_type == $ type) $ okay = true; rompere; 
  • Iniziamo creando un array chiamato $ accepted_types. Una rapida ricerca su Google per "tipi di mime zip" ci porterà quattro valori: 'application / zip', 'application / x-zip-compressed', 'multipart / x-zip', 'application / s-compressed'. Ogni browser ha il proprio modo di registrare il tipo di file. Dobbiamo essere sicuri di controllare ogni valore in tali casi.
  • Per fare ciò, controlliamo se uno qualsiasi degli elementi nel nostro array ha lo stesso valore di "$ _FILES ['fupload'] ['type']". Se lo fanno, imposteremo la nostra variabile dandy "$ okay" uguale a "true" - e possiamo uscire dall'istruzione "for" e stare tranquilli che l'utente ha in effetti scelto un file zip.

Purtroppo, Safari e Chrome non registrano un tipo per i file zip. Questo crea un problema per noi. Dopo un po 'di ricerche, non sono stato in grado di trovare una soluzione facile, senza usare un'estensione (PEAR). Invece, ci assicureremo che il nome del file finisca almeno in "zip". Va notato che questo non è sicuro al 100%. Cosa succede se l'utente ha caricato un tipo di file diverso che termina con "zip"? Sentiti libero di offrire raccomandazioni! :)

 $ okay = strtolower ($ name [1]) == 'zip'? vero falso;
  • Useremo l'operatore ternario per mantenere questa affermazione su una riga. Se l'estensione del nome file ($ name [1]) è uguale a 'zip', imposteremo $ okay su true. Altrimenti, sarà uguale a "falso".

Successivamente, controlleremo se $ ok è falso. Se lo è, sappiamo che non è stato scelto un file "zip". In questi casi, diremo a PHP di morire.

 if (! $ okay) die ("Per favore, scegli un file zip, manichino!"); 

Passaggio 4: salvataggio del file zip

 mkdir ($ target); $ saved_file_location = $ target. $ Nomefile; if (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("C'era un problema, mi dispiace!"); 
  • Per prima cosa dobbiamo creare la directory a cui abbiamo fatto riferimento con la nostra variabile $ target. Questo può essere fatto facilmente usando la funzione "mkdir".
  • Successivamente, proviamo a spostare il file caricato, dalla directory temporanea, alla nostra directory $ target. Se quella procedura è stata eseguita con successo, chiameremo la funzione "openZip".

Passaggio 5: la funzione openZip ()

Crea una nuova pagina e salvala come "functions.php". Ora aggiungi il seguente codice:

 aperta ($ file_to_open); if ($ x === true) $ zip-> extractTo ($ target); $ Archivio zip> close (); unlink ($ file_to_open);  else die ("C'era un problema, per favore riprova!"); ?>

Questa funzione accetta un parametro: $ file_to_open. Questo parametro conterrà la posizione del file zip che stiamo cercando di estrarre!

  • Per usare la classe ZipArchive (), devi prima assicurarti di abilitare "php_zip.dll" nel tuo file "php.ini". Basta cercare quella stringa e quindi rimuovere il punto e virgola.
  • Con qualsiasi classe, dobbiamo creare una nuova istanza dell'oggetto. Chiameremo successivamente il metodo "open" e passeremo nella posizione del file che dovrebbe essere aperto. Se eseguito con successo, questo metodo restituirà 'true'. In questo caso, estraiamo il contenuto del file zip in una cartella. Abbiamo già creato il percorso di questa cartella quando abbiamo creato la nostra variabile $ target. (Nota - Per accedere a tale variabile, è necessario aggiungere "globale" davanti alla variabile. Questo dirà a PHP di andare fuori dalla funzione corrente e cercare la variabile $ target.).
  • Una volta che i file sono stati estratti, elimineremo il file zip, poiché non ne abbiamo più bisogno!

Ricorda: abbiamo creato il nostro nuovo file "functions.php", ma dobbiamo includerlo! Aggiungi quanto segue all'inizio della tua pagina 'index.php', subito dopo l'apertura del tag PHP.

 require_once 'functions.php';

Facendo eco ai contenuti

Ciò che abbiamo finora funziona perfettamente! Ma, solo per darti un feedback, scansioniamo la nuova directory e riecheggeremo i contenuti. Dovresti cancellare questo prossimo blocco di codice dal tuo progetto. È solo per i test. Se vuoi mantenerlo, fai eco alle informazioni all'interno del tag del corpo.

 $ scan = scandir ($ target. $ name [0]); stampare '
    '; per ($ 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]. '
  • '; print '
';

Non parlerò troppo di quest'ultima parte, perché non è necessario. Tuttavia, se desideri una spiegazione completa, assicurati di guardare lo screencast associato! Per riassumere rapidamente, quest'ultimo script analizza la nostra nuova directory ed esegue l'echi di una lista non ordinata contenente i contenuti.

Finito

Non troppo difficile, eh? È una caratteristica chiara che può essere facilmente implementata nei tuoi progetti. Quali sono i tuoi pensieri sulla sicurezza quando si tratta di caricare file zip? Come possiamo essere sicuri che il contenuto del file zip non sia dannoso? Mi piacerebbe sentire l'opinione di tutti su queste implicazioni sulla sicurezza. Se non gestito correttamente, un hacker potrebbe causare gravi danni al tuo server. Discutiamolo! È possibile cercare tipi di file pericolosi (file .htaccess) ed eliminarli.

La pagina finale Index.php

 '; per ($ 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]. '
  • '; print ''; ?> Come caricare e aprire file zip con PHP

    Carica un file zip


    • Iscriviti al feed RSS di NETTUTS per ulteriori tuts e articoli di sviluppo web giornalieri.