Comment ouvrir des fichiers Zip avec PHP

ThemeForest a une fonctionnalité intéressante; Il permet aux auteurs de télécharger des fichiers zip contenant des captures d'écran de leurs thèmes. Un script extrait ensuite ces fichiers et affiche les images en conséquence. Bien que je doute que les développeurs aient utilisé PHP pour accomplir cette tâche… c'est ce que nous allons utiliser!


Ce qu'il faut faire

  • Créer un formulaire de téléchargement simple qui permet à l'utilisateur de sélectionner un fichier zip.
  • Assurez-vous que l'utilisateur choisit un fichier zip, puis enregistrez-le dans un fichier unique..
  • Extrayez le contenu du fichier zip et enregistrez-le dans un dossier spécifique.
  • Supprimer le fichier zip et en afficher le contenu.

Étape 1: Création du formulaire de téléchargement

  • Créez un nouveau fichier et enregistrez-le sous le nom index.html à la racine de votre solution..
  • Ensuite, nous allons construire un formulaire simple. Coller ce qui suit dans.
 

À chaque fois que vous autoriserez vos utilisateurs à télécharger des fichiers, vous devez définir le "type" de la balise de formulaire égal à "multipart / form-data". Nous allons ensuite définir l'action égale à la même page et la méthode égale à post.

Pour que les choses soient aussi simples que possible, nous avons uniquement une entrée de fichier et un bouton d'envoi. Notez que nous avons défini le nom de l'entrée du fichier sur "fupload". Nous allons bientôt utiliser cette valeur pour déterminer si la page a été postée en retour.

Étape 2: Écrire le PHP

Tout en haut de votre page index.php, avant la déclaration du doctype, collez ce qui suit:

  

Allons-y pas à pas.

  • Si la balise d'entrée avec le nom "fupload" est définie, exécutez le code suivant, sinon, ne faites rien.
  • Nous devons maintenant créer quelques variables. Nous devons capturer le nom du fichier téléchargé, le répertoire dans lequel le fichier est stocké temporairement et le type de fichier choisi.

Supposons qu'un utilisateur choisit un fichier appelé "myPics.zip".

  • $ _FILES ["fupload"] ["name"] = "myPics.zip"
  • $ _FILES ["fupload"] ["tmp_name"] = un répertoire temporaire sur le serveur.
  • $ _FILES ["fupload"] ["type"] = "application / zip". (Cette valeur peut changer en fonction du navigateur depuis lequel le fichier a été téléchargé..

Ensuite, décomposons le nom du fichier en deux parties: le nom et l’extension..

 $ name = explode ('.', $ nomfichier); $ target = 'extrait /'. $ name [0]. '-' temps() . '/';

Continuant avec notre exemple de fichier "myPics.zip" - $ name [0] sera égal à "myPics". $ name [1] sera égal à "zip".

Ensuite, nous créons une nouvelle variable appelée "$ target". Ce sera l'emplacement où notre fichier est enregistré. Pour que les fichiers d'un autre utilisateur portant le même nom "myPics" ne soient pas écrasés, nous devons nous assurer que les fichiers sont enregistrés dans un emplacement unique. Pour accomplir cette tâche, nous allons implémenter la fonction "time ()". Si nous ajoutons cette valeur au nom du fichier téléchargé, nous pouvons être sûrs que nous aurons un nom de dossier unique.!

$ target = "extract / myPics-02151985 /"

Étape 3: Assurez-vous qu'un fichier zip a été sélectionné

Immédiatement après votre variable $ target, collez ce qui suit:

 $ shared_types = array ('application / zip', 'application / x-zip-compressé', 'multipart / x-zip', 'application / s-compressé'); foreach ($ acceptés_types comme $ mime_type) if ($ mime_type == $ type) $ okay = true; Pause; 
  • Nous commençons par créer un tableau appelé $ shared_types. Une recherche rapide sur Google pour "types de mime zip" nous apportera quatre valeurs: 'application / zip', 'application / x-zip-compressé', 'multipart / x-zip', 'application / s-compressé'. Chaque navigateur a sa propre manière d’enregistrer le type de fichier. Nous devons nous assurer de vérifier chaque valeur dans de tels cas.
  • Pour ce faire, nous vérifions si l'un des éléments de notre tableau a la même valeur que "$ _FILES ['fupload'] ['type']". Si tel est le cas, nous attribuerons à notre variable handy-dandy "$ okay" la valeur "true" - nous pouvons sortir de l'instruction "for" et être assuré que l'utilisateur a effectivement choisi un fichier zip.

Malheureusement, Safari et Chrome n'enregistrent pas de type pour les fichiers zip. Cela crée un problème pour nous. Après quelques recherches, je n'ai pas pu trouver de solution simple - sans utiliser une extension (PEAR). Au lieu de cela, nous allons nous assurer que le nom du fichier se termine au moins par "zip". Il convient de noter que ce n'est pas sûr à 100%. Que se passe-t-il si l'utilisateur a téléchargé un type de fichier différent qui s'est terminé par "zip"? N'hésitez pas à offrir des recommandations! :)

 $ ok = strtolower ($ name [1]) == 'zip'? vrai faux;
  • Nous allons utiliser l'opérateur ternaire pour limiter cette déclaration à une ligne. Si l'extension du nom de fichier ($ name [1]) est égale à 'zip', nous allons définir $ okay sur true. Sinon, ce sera égal à 'faux'.

Ensuite, nous vérifierons si $ okay est faux. Si c'est le cas, nous savons qu'un fichier 'zip' n'a pas été choisi. Dans de tels cas, nous dirons à PHP de mourir.

 if (! $ okay) die ("Veuillez choisir un fichier zip, factice!"); 

Étape 4: enregistrement du fichier Zip

 mkdir ($ target); $ saved_file_location = $ target. $ nom de fichier; if (move_uploaded_file ($ source, $ saved_file_location)) openZip ($ saved_file_location);  else die ("Il y avait un problème. Désolé!"); 
  • Nous devons d’abord créer le répertoire que nous avons référencé avec notre variable $ target. Cela peut facilement être fait en utilisant la fonction "mkdir".
  • Essayons ensuite de déplacer le fichier téléchargé, du répertoire temporaire, vers notre répertoire $ target. Si cette procédure a été effectuée avec succès, nous appellerons la fonction "openZip".

Étape 5: La fonction openZip ()

Créez une nouvelle page et enregistrez-la sous "functions.php". Maintenant, ajoutez le code suivant:

 open ($ file_to_open); if ($ x === true) $ zip-> extractTo ($ target); $ zip-> close (); unlink ($ file_to_open);  else die ("Il y avait un problème. Veuillez réessayer!"); ?>

Cette fonction acceptera un paramètre: $ file_to_open. Ce paramètre contient l'emplacement du fichier zip que nous essayons d'extraire!

  • Pour utiliser la classe ZipArchive (), vous devez d'abord vous assurer que vous activez 'php_zip.dll' dans votre fichier "php.ini". Il suffit de rechercher cette chaîne, puis supprimez le point-virgule.
  • Avec n'importe quelle classe, nous devons créer une nouvelle instance de l'objet. Nous allons ensuite appeler la méthode "open" et indiquer l'emplacement du fichier à ouvrir. Si elle réussit, cette méthode retournera 'true'. Si tel est le cas, nous extrairons le contenu du fichier zip dans un dossier. Nous avons déjà créé le chemin d'accès à ce dossier lorsque nous avons créé notre variable $ target. (Remarque - Pour accéder à cette variable, vous devez ajouter «global» devant la variable. Cela dira à PHP de sortir de la fonction courante et de rechercher la variable $ target.).
  • Une fois les fichiers extraits, nous supprimerons le fichier zip - nous n'en avons plus besoin!

Rappelez-vous - nous avons créé notre nouveau fichier 'functions.php', mais nous devons l'inclure! Ajoutez ce qui suit en haut de votre page 'index.php', juste après la balise PHP d'ouverture.

 require_once 'functions.php';

En écho au contenu

Ce que nous avons jusqu'à présent fonctionne à merveille! Mais, juste pour vous donner quelques retours, analysons le nouveau répertoire et en renvoyons le contenu. Vous devez supprimer ce prochain bloc de code de votre projet. C'est seulement pour les tests. Si vous souhaitez le conserver, renvoyez les informations dans la balise body..

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

Je ne reviendrai pas trop sur cette dernière partie car elle est inutile. Toutefois, si vous souhaitez une explication complète, veillez à regarder le screencast associé! Pour résumer rapidement, ce dernier script analyse notre nouveau répertoire et renvoie une liste non ordonnée contenant le contenu..

Fini

Pas trop dur, hein? C'est une fonctionnalité intéressante qui peut facilement être implémentée dans vos projets. Que pensez-vous de la sécurité lors du téléchargement de fichiers zip? Comment pouvons-nous être sûrs que le contenu du fichier zip ne soit pas dangereux? J'aimerais entendre l'opinion de chacun sur ces implications pour la sécurité. S'il n'est pas traité correctement, un pirate informatique pourrait causer de graves dommages à votre serveur. Parlons-en! Il est possible de rechercher des types de fichiers dangereux (fichiers .htaccess) et de les supprimer..

La page finale Index.php

 '; pour ($ 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]. '
  • '; impression ''; ?> Comment télécharger et ouvrir des fichiers Zip avec PHP

    Télécharger un fichier Zip


    • Abonnez-vous au flux RSS NETTUTS pour plus de commentaires et d'articles sur le développement Web au quotidien.