So öffnen Sie Zip-Dateien mit PHP

ThemeForest hat eine nette Funktion; Es ermöglicht den Autoren, Zip-Dateien mit Screenshots ihrer Designs hochzuladen. Ein Skript extrahiert dann diese Dateien und zeigt die Bilder entsprechend an. Obwohl ich bezweifle, dass die Entwickler PHP verwendet haben, um diese Aufgabe zu erledigen ... das werden wir verwenden!


Was müssen wir tun?

  • Erstellen Sie ein einfaches Upload-Formular, mit dem Sie eine ZIP-Datei auswählen können.
  • Stellen Sie sicher, dass der Benutzer eine ZIP-Datei auswählt, und speichern Sie sie dann als eindeutige Datei.
  • Extrahieren Sie den Inhalt aus der ZIP-Datei und speichern Sie sie in einem bestimmten Ordner.
  • Löschen Sie die ZIP-Datei und wiederholen Sie den Inhalt.

Schritt 1: Erstellen des Upload-Formulars

  • Erstellen Sie eine neue Datei und speichern Sie sie als index.html im Stammverzeichnis Ihrer Lösung.
  • Als Nächstes erstellen wir ein einfaches Formular. Fügen Sie Folgendes in ein.
 

Jedes Mal, wenn Sie Ihren Benutzern das Hochladen von Dateien gestatten, müssen Sie den "enctype" des Formulartags gleich setzen "multipart / form-data". Als Nächstes setzen wir die Aktion auf dieselbe Seite und die Methode auf post.

Um die Dinge so gut wie möglich zu halten, haben wir nur eine Dateieingabe und eine Senden-Schaltfläche. Beachten Sie, dass wir den Namen der Dateieingabe auf "fupload" gesetzt haben. Wir werden diesen Wert in Kürze verwenden, um festzustellen, ob die Seite zurückgeschickt wurde oder nicht.

Schritt 2: PHP schreiben

Fügen Sie am Anfang der Seite "index.php" vor der Deklaration des Doctype Folgendes ein:

  

Nehmen wir es Schritt für Schritt.

  • Wenn das Eingabe-Tag mit dem Namen "fupload" festgelegt ist, führen Sie den folgenden Code aus, andernfalls müssen Sie nichts tun.
  • Nun müssen wir einige Variablen erstellen. Wir müssen den Namen der hochgeladenen Datei, das Verzeichnis, in dem die Datei zwischengespeichert wird, und den ausgewählten Dateityp erfassen.

Nehmen wir an, ein Benutzer wählt eine Datei namens "myPics.zip" aus..

  • $ _FILES ['fupload'] ['name'] = "myPics.zip"
  • $ _FILES ['fupload'] ['tmp_name'] = ein temporäres Verzeichnis auf dem Server.
  • $ _FILES ['fupload'] ['type'] = "application / zip". (Dieser Wert kann sich je nach Browser ändern, aus dem die Datei hochgeladen wurde.

Lassen Sie uns als Nächstes den Dateinamen in zwei Teile aufteilen: den Namen und die Erweiterung.

 $ name = explodieren ('.', $ dateiname); $ target = 'extrahiert /'. $ name [0]. '-'. Zeit() . '/';

Fortsetzung unserer Beispieldatei "myPics.zip" - $ name [0] entspricht "myPics". $ name [1] wird gleich "zip" sein.

Als Nächstes erstellen wir eine neue Variable mit dem Namen "$ target". Dies ist der Ort, an dem unsere Datei gespeichert wird. Um sicherzustellen, dass die Dateien eines anderen Benutzers mit dem Namen "myPics" nicht überschrieben werden, müssen wir sicherstellen, dass die Dateien an einem eindeutigen Ort gespeichert werden. Um diese Aufgabe zu erfüllen, implementieren wir die Funktion "time ()". Wenn wir diesen Wert an den Namen der hochgeladenen Datei anhängen, können wir sicher sein, dass wir einen eindeutigen Ordnernamen erhalten!

$ target = "extrahiert / myPics-02151985 /"

Schritt 3: Stellen Sie sicher, dass eine ZIP-Datei ausgewählt wurde

Fügen Sie unmittelbar nach Ihrer $ target-Variablen Folgendes ein:

 $ Accepted_types = Array ('application / zip', 'application / x-zip-komprimiert', 'multipart / x-zip', 'application / s-komprimiert'); foreach ($ akzeptierte_typen als $ mime_type) if ($ mime_type == $ type) $ okay = true; brechen; 
  • Wir beginnen mit der Erstellung eines Arrays mit dem Namen $ akzeptierte_types. Eine schnelle Google-Suche nach "Zip-Mime-Typen" bringt uns vier Werte: 'application / zip', 'application / x-zip-komprimiert', 'multipart / x-zip', 'application / s-komprimiert'. Jeder Browser hat seinen eigenen Weg, den Dateityp zu registrieren. In solchen Fällen müssen wir jeden Wert überprüfen.
  • Dazu prüfen wir, ob eines der Elemente in unserem Array den gleichen Wert wie "$ _FILES ['fupload'] ['type']" hat. Wenn dies der Fall ist, setzen wir unsere "$ okay" -Variable von handlich auf "true" - und können die "for" -Anweisung aufbrechen. Sie können sicher sein, dass der Benutzer tatsächlich eine zip-Datei gewählt hat.

Leider registrieren Safari und Chrome keinen Typ für ZIP-Dateien. Dies schafft ein Problem für uns. Nach einiger Recherche konnte ich keine einfache Lösung finden - ohne die Verwendung einer Erweiterung (PEAR). Stattdessen sorgen wir dafür, dass der Dateiname mindestens in "zip" endet.. Es sei darauf hingewiesen, dass dies nicht 100% sicher ist. Was ist, wenn der Benutzer einen anderen Dateityp hochgeladen hat, der mit 'zip' endete? Fühlen Sie sich frei, um Empfehlungen zu geben! :)

 $ okay = strtolower ($ name [1]) == 'zip'? wahr falsch;
  • Wir verwenden den ternären Operator, um diese Aussage auf eine Zeile zu beschränken. Wenn die Erweiterung des Dateinamens ($ name [1]) gleich "zip" ist, setzen wir $ okay auf true. Andernfalls ist es gleich "falsch"..

Als Nächstes prüfen wir, ob $ okay falsch ist. Wenn dies der Fall ist, wissen wir, dass keine ZIP-Datei ausgewählt wurde. In solchen Fällen sagen wir PHP, dass es sterben soll.

 if (! $ okay) die ("Bitte wählen Sie eine ZIP-Datei, Dummy!"); 

Schritt 4: Speichern der Zip-Datei

 mkdir ($ target); $ saved_file_location = $ target. $ Dateiname; if (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("Es gab ein Problem. Entschuldigung!"); 
  • Zuerst müssen wir das Verzeichnis erstellen, auf das wir mit unserer $ target-Variablen verwiesen haben. Dies kann leicht mit der Funktion "mkdir" durchgeführt werden.
  • Als Nächstes versuchen wir, die hochgeladene Datei aus dem temporären Verzeichnis in unser $ target-Verzeichnis zu verschieben. Wenn diese Prozedur erfolgreich ausgeführt wurde, rufen wir die Funktion "openZip" auf.

Schritt 5: Die openZip () - Funktion

Erstellen Sie eine neue Seite und speichern Sie sie als "functions.php". Fügen Sie nun folgenden Code hinzu:

 offen ($ file_to_open); if ($ x === true) $ zip-> extractTo ($ target); $ zip-> close (); unlink ($ file_to_open);  else die ("Es gab ein Problem. Bitte versuchen Sie es erneut!"); ?>

Diese Funktion akzeptiert einen Parameter: $ file_to_open. Dieser Parameter enthält den Ort der ZIP-Datei, die wir extrahieren möchten!

  • Um die ZipArchive () - Klasse verwenden zu können, müssen Sie zunächst sicherstellen, dass "php_zip.dll" in Ihrer Datei "php.ini" aktiviert ist. Suchen Sie einfach nach dieser Zeichenfolge und entfernen Sie dann das Semikolon.
  • Bei jeder Klasse müssen wir eine neue Instanz des Objekts erstellen. Als nächstes rufen wir die "open" -Methode auf und übergeben den Speicherort der Datei, die geöffnet werden soll. Bei erfolgreicher Ausführung gibt diese Methode 'true' zurück. Wenn dies der Fall ist, extrahieren wir den Inhalt der ZIP-Datei in einen Ordner. Der Pfad zu diesem Ordner wurde bereits erstellt, als wir unsere $ target-Variable erstellt haben. (Hinweis - Um auf diese Variable zugreifen zu können, müssen Sie der Variablen "global" hinzufügen. Dadurch wird PHP angewiesen, die aktuelle Funktion zu verlassen und nach der $ target-Variablen zu suchen.).
  • Nachdem die Dateien extrahiert wurden, löschen wir die ZIP-Datei, da wir sie nicht mehr benötigen!

Denken Sie daran - wir haben unsere neue "functions.php" -Datei erstellt, müssen sie aber einfügen! Hängen Sie das folgende an den Anfang Ihrer 'index.php'-Seite, direkt nach dem öffnenden PHP-Tag.

 required_once 'functions.php';

Den Inhalt wiederholen

Was wir bisher haben, funktioniert einwandfrei! Aber um Ihnen etwas Feedback zu geben, lassen Sie uns das neue Verzeichnis durchsuchen und den Inhalt wiederholen. Sie sollten diesen nächsten Codeblock aus Ihrem Projekt löschen. Es ist nur zum Testen. Wenn Sie es behalten möchten, geben Sie die Informationen im body-Tag aus.

 $ scan = scandir ($ target. $ name [0]); drucken '
    '; für ($ 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]. '
  • '; drucken '
';

Ich werde diesen letzten Teil nicht zu sehr durchgehen, da er unnötig ist. Wenn Sie jedoch eine ausführliche Erklärung wünschen, sollten Sie unbedingt den zugehörigen Screencast ansehen! Um es kurz zusammenzufassen, scannt dieses letzte Skript unser neues Verzeichnis und gibt eine ungeordnete Liste heraus, die den Inhalt enthält.

Fertig

Nicht zu schwer, wie? Es ist eine nette Funktion, die leicht in Ihre Projekte integriert werden kann. Was sind Ihre Gedanken zur Sicherheit beim Hochladen von ZIP-Dateien? Wie können wir sicher sein, dass der Inhalt der ZIP-Datei nicht schädlich ist? Ich würde gerne alle Meinungen zu diesen Auswirkungen auf die Sicherheit hören. Bei unsachgemäßer Handhabung kann ein Hacker Ihren Server ernsthaft beschädigen. Lass es uns besprechen! Es ist möglich, nach gefährlichen Dateitypen (.htaccess-Dateien) zu suchen und diese zu löschen.

Die letzte Index.php-Seite

 '; für ($ 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]. '
  • '; drucken ''; ?> So laden und laden Sie Zip-Dateien mit PHP

    Laden Sie eine Zip-Datei hoch


    • Abonnieren Sie den NETTUTS-RSS-Feed für mehr tägliche Webentwicklungsberichte und -artikel.