La première moitié de ce didacticiel explique différentes manières de créer un fichier zip à l'aide des API CodeIgniter intégrées. Nous verrons comment créer et sauvegarder des fichiers zip sur le serveur et comment les rendre accessibles au téléchargement pour les utilisateurs finaux..
La seconde partie inclut une discussion sur la manière de décompresser le fichier. Pour illustrer cela, nous allons créer une page personnalisée permettant aux utilisateurs de télécharger des fichiers zip qui seront extraits sur le serveur une fois le téléchargement effectué. Pour obtenir la fonctionnalité désirée, l’extension PHP ZipArchive vient à notre secours!
Avant de poursuivre dans le développement, je vais énumérer les fichiers que nous allons développer au cours de ce tutoriel:
application / contrôleurs / Zip.php
: C'est un fichier de contrôleur qui montre différentes manières de créer un fichier zip.application / controllers / Unzip.php
: C'est un fichier de contrôleur qui inclut le code utilisé pour décompresser un fichier téléchargé par l'utilisateur.application / views / file_upload_form.php
: C'est un fichier de vue qui contient du code HTML assez bas pour le téléchargement de fichier.application / views / file_upload_result.php
: C'est un fichier de vue qui montre le résultat d'un fichier téléchargé par l'utilisateur; fondamentalement, il vous dit si le fichier a été décompressé avec succès.application / libraries / Extractor.php
: Ce fichier illustre le concept d'une bibliothèque personnalisée dans CodeIgniter.Avec tout en place, nous sommes prêts à passer à notre prochaine section!
Allez-y et créez un fichier application / contrôleurs / Zip.php
avec le contenu suivant.
chargement-> bibliothèque ('zip'); fonction privée _archieve_and_download ($ filename) // crée un fichier zip sur le serveur $ this-> zip-> archive (FCPATH. '/ uploads /'.$ filename); // invite l'utilisateur à télécharger le fichier zip $ this-> zip-> download ($ filename); fonction publique data () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'développeur web'); $ this -> _ archieve_and_download ('mon_info.zip'); fonction publique data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Développeur Web'); $ this-> zip-> add_data ($ fichiers); $ this -> _ archieve_and_download ('mon_info.zip'); fonction publique data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ this -> _ archieve_and_download ('mon_info.zip'); public function files () $ this -> _ load_zip_lib (); // passe le second argument sous la forme TRUE si l'on veut conserver la structure de répertoire $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ this-> zip-> read_file (FCPATH. '/ uploads / 2.jpg'); $ this -> _ archieve_and_download ('images.zip'); public function dir () $ this -> _ load_zip_lib (); // passe le second argument sous la forme FALSE si l'on veut ignorer les répertoires précédents $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ this -> _ archieve_and_download ('dir_images.zip');
C'est un fichier de contrôleur assez standard que vous connaissez déjà. Il contient plusieurs méthodes, et chacune d’elles vous montre une manière différente de créer un fichier zip..
En dehors de cela, il fournit deux méthodes privées, _load_zip_lib
et _archieve_and_download
, qui sont appelés à partir du reste des méthodes. Bien sûr, vous n'avez pas besoin d'implémenter ces méthodes, mais nous venons de refactoriser notre code afin de ne pas répéter le même code dans d'autres méthodes. Passons d'abord par ces deux méthodes.
Voici ce que la méthode _load_zip_lib
ressemble à.
fonction privée _load_zip_lib () $ this-> load-> library ('zip');
Il charge la bibliothèque zip intégrée du framework CodeIgniter afin que vous puissiez utiliser les fonctionnalités de cette bibliothèque tout au long du code. Maintenant, vous pouvez accéder à la bibliothèque zip avec le $ this-> zip
convention.
Ensuite, il y a la _archieve_and_download
méthode.
fonction privée _archieve_and_download ($ filename) // crée un fichier zip sur le serveur $ this-> zip-> archive (FCPATH. '/ uploads /'.$ filename); // invite l'utilisateur à télécharger le fichier zip $ this-> zip-> download ($ filename);
Comme nous avons chargé la bibliothèque zip, vous pouvez utiliser les méthodes fournies par celle-ci. La méthode d'archivage vous permet de créer un fichier zip dans le chemin indiqué comme premier argument. D'autre part, la méthode de téléchargement invite l'utilisateur à télécharger le fichier..
Ne vous inquiétez pas si vous vous interrogez sur le contenu de notre fichier zip, nous le verrons dans un instant..
Tout est en place, nous sommes donc prêts à rouler!
Prenons le code de la Les données
méthode. Cette méthode vous montre comment créer des fichiers à la volée et les envelopper dans un fichier zip..
fonction publique data () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('profile.txt', 'développeur web'); $ this -> _ archieve_and_download ('mon_info.zip');
Pour commencer, nous avons appelé le _load_zip_lib
méthode qui charge la bibliothèque zip. Ensuite, nous avons utilisé le add_data
méthode de la classe zip qui vous permet de créer un fichier et de le remplir avec le contenu en même temps! Bien sûr, il est également ajouté à l'archive!
Le premier argument doit être le nom du fichier et le second argument contient le contenu du fichier..
Comme vous pouvez le constater, nous avons ajouté deux fichiers, nom.txt
et profile.txt
, avec quelques contenus de démonstration. Enfin, nous appelons _archieve_and_download
avec mon_info.zip
comme argument de cette méthode. Qu'est ce que ça fait?
mon_info.zip
sous votre répertoire uploads.mon_info.zip
.Alors assurez-vous que vous avez créé un les téléchargements
répertoire à la racine de votre site. Assurez-vous également qu’il soit accessible en écriture à l’utilisateur du serveur Web. Maintenant, allez-y et lancez «http: // my-codeingiter-site / zip / data» pour voir les choses en action!
Si vous avez des problèmes, vous pouvez me demander dans les commentaires!
Ensuite, il y a la data_array
méthode.
fonction publique data_array () $ this -> _ load_zip_lib (); $ files = array ('name.txt' => 'Sajal Soni', 'profile.txt' => 'Développeur Web'); $ this-> zip-> add_data ($ fichiers); $ this -> _ archieve_and_download ('mon_info.zip');
Cette méthode est identique à celle de la dernière que nous venons de parler, sauf que nous avons fourni un tableau de fichiers au add_data
méthode au lieu de fichiers individuels!
Ensuite, prenons le code de la data_with_subdirs
méthode.
fonction publique data_with_subdirs () $ this -> _ load_zip_lib (); $ this-> zip-> add_data ('info / name.txt', 'Sajal Soni'); $ this-> zip-> add_data ('info / profile.txt', 'Web Developer'); $ this -> _ archieve_and_download ('mon_info.zip');
Juste au cas où vous voudriez organiser vos fichiers dans certains répertoires, le add_data
Cette méthode vous permet également de les créer. Le résultat de la méthode ci-dessus ne sera pas différent si ce n’est que le nom.txt
et profile.txt
les fichiers seront placés dans le Info
annuaire.
Bien que le add_data
La méthode fournit une fonctionnalité intéressante qui vous permet de créer des fichiers à la volée. Le plus souvent, vous aurez besoin de compresser des fichiers existants sur le serveur. Quoi qu'il en soit, c'est exactement le sujet de nos prochaines méthodes.
Regardons rapidement ce que notre prochain des dossiers
méthode ressemble. Il va créer un zip de fichiers sous le les téléchargements
annuaire.
fichiers de fonction publique () $ this -> _ load_zip_lib (); // passe le second argument sous la forme TRUE si l'on veut conserver la structure de répertoire $ this-> zip-> read_file (FCPATH. '/ uploads / 1.jpg'); $ this-> zip-> read_file (FCPATH. '/ uploads / 2.jpg'); $ this -> _ archieve_and_download ('images.zip');
Le but de la read_file
méthode consiste à lire le fichier existant sur le serveur et à l’ajouter à l’archive. Comme vous pouvez le constater, nous avons ajouté les deux fichiers 1.jpg
et 2.jpg
aux archives. Bien entendu, ces deux fichiers doivent être présents sous le les téléchargements
répertoire à la racine de votre site.
Si vous passez VRAI
comme deuxième argument de la read_file
méthode, le fichier zip résultant conserve la structure exacte du répertoire dans lequel le fichier a été placé..
Essayez d’exécuter http: // my-codeingiter-site / zip / files et vérifiez le résultat.!
La dernière méthode de ce segment est la dir
méthode. Cela va créer une archive zip de tout le répertoire.
fonction publique dir () $ this -> _ load_zip_lib (); // passe le second argument sous la forme FALSE si l'on veut ignorer les répertoires précédents $ this-> zip-> read_dir (FCPATH. '/ uploads / images /'); $ this -> _ archieve_and_download ('dir_images.zip');
Vous pouvez utiliser le read_dir
méthode si vous voulez créer une archive zip de tout le répertoire au lieu de certains fichiers. Dans notre exemple ci-dessus, il va créer un dir_images.zip
fichier qui contient tous les fichiers sous le / uploads / images /
annuaire.
La chose importante à noter ici est que la structure de répertoires entière sera préservée par défaut dans le fichier zip. Mais si vous voulez l'ignorer, il suffit de passer FAUX
comme deuxième argument de la read_dir
méthode. Dans ce cas, il ne fera que créer un images
répertoire dans le fichier zip.
Cela termine donc notre histoire sur la création d’une archive zip à l’aide de diverses méthodes fournies par la classe zip intégrée..
Malheureusement, aucune bibliothèque CodeIgniter intégrée ne nous permet de décompresser l'archive zip. Mais l'extension PHP de ZipArchive en fait un jeu d'enfant, comme nous le verrons dans un instant.
Nous allons créer un exemple assez simple qui montre comment décompresser les fichiers téléchargés par l'utilisateur.
Allez-y et créez un fichier application / controllers / Unzip.php
avec le contenu suivant.
load-> helper (tableau ('formulaire', 'url')); fonction publique index () $ this-> load-> view ('file_upload_form'); fonction publique upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ()); else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; / **** sans bibliothèque **** / $ zip = new ZipArchive; if ($ zip-> open ($ chemin_complet) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ zip-> close (); $ params = array ('success' => 'Extrait avec succès!'); $ this-> load-> view ('file_upload_result', $ params);
Créons également nos modèles de vue, puis nous verrons comment cela fonctionne..
Créer un fichier de modèle de vue application / views / file_upload_form.php
avec le contenu suivant.
Bienvenue chez CodeIgniter Téléverser un fichier
Il crée un simple formulaire de téléchargement de fichier afin que l'utilisateur puisse télécharger le fichier zip! S'il vous plaît noter que je l'ai gardé au minimum pour des raisons de simplicité.
Ensuite, créons un fichier de gabarit de vue application / views / file_upload_result.php
.
Bienvenue chez CodeIgniter Résultat du fichier téléchargé
"><< Back to File Uploader
Une fois le fichier téléchargé et extrait, le modèle ci-dessus s'affichera..
Maintenant, revenons à notre contrôleur et passons en revue chaque méthode.
Dans le constructeur de notre contrôleur, nous avons chargé la fonction intégrée forme et url Les aides CodeIgniter, afin que nous puissions utiliser des fonctions d’aide telles que form_open_multipart
, URL du site
etc.
Ensuite, regardons le indice
méthode.
fonction publique index () $ this-> load-> view ('file_upload_form');
Cela nécessite-t-il une explication? Il appelle la vue fichier_upload_form
et rend la page. Ainsi, lorsque vous accédez à http: // my-codeingiter-site / unzip, il devrait afficher un simple formulaire de téléchargement de fichier, comme indiqué ci-dessous..
Notez également que l’action de notre formulaire est décompresser / télécharger
où les données seront affichées. Nous avons utilisé le form_open_multipart
assistant pour générer la balise de formulaire multipart!
Ensuite, nous devons mettre en œuvre le télécharger
méthode d'action qui gérera le téléchargement de fichiers et l'extraction. Prenez le code de celui de la Décompressez.php
manette.
fonction publique upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ()); else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ zip = new ZipArchive; if ($ zip-> open ($ chemin_complet) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ zip-> close (); $ params = array ('success' => 'Extrait avec succès!'); $ this-> load-> view ('file_upload_result', $ params);
Si vous connaissez le téléchargement de fichiers dans CodeIgniter, le code ne doit pas vous paraître étranger. Pour ceux qui ne sont pas familiers, il n'y a rien à craindre, car les API de téléchargement intégrées dans CodeIgniter en font un jeu d'enfant..
Le code suivant charge la bibliothèque de téléchargement avec une configuration initiale fournie par le $ config
variable tableau.
$ this-> load-> library ('upload', $ config);
Nous l'avons configuré pour que le fichier téléchargé soit placé sous le les téléchargements
répertoire à la racine de l'application, et l'utilisateur ne sera autorisé à télécharger que des fichiers zip.
Ensuite, nous avons vérifié si le téléchargement du fichier a échoué et, le cas échéant, nous allons extraire un message d'erreur utile et l'assigner à $ params
afin que nous puissions l'afficher dans le modèle.
$ params = array ('error' => $ this-> upload-> display_errors ());
Dans ce cas, le fichier est téléchargé avec succès. La prochaine étape consiste à obtenir le chemin du fichier téléchargé..
$ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path'];
Enfin, nous instancions un objet ZipArchive, ouvrons notre fichier zip et extrayons-le dans le les téléchargements
annuaire.
$ zip = new ZipArchive; if ($ zip-> open ($ chemin_complet) === TRUE) $ zip-> extractTo (FCPATH. '/ uploads /'); $ zip-> close ();
N'était-ce pas simple??
La seule chose qui nous reste est d'appeler le file_upload_result
voir, et voici à quoi cela devrait ressembler!
Donc, c'est l'autre partie de l'histoire!
Vous auriez remarqué que le télécharger
Cette méthode contient le code ZipArchive qui extrait le fichier téléchargé. Que faire si vous devez utiliser ce code à plusieurs endroits? Vous pourriez être tenté de copier et coller le code au besoin.
En effet, CodeIgniter permet de mieux centraliser le code pouvant être utilisé dans l’application. Vous pouvez créer une bibliothèque personnalisée.
Allez-y et créez un fichier application / libraries / Extractor.php
avec le contenu suivant.
CI = & get_instance (); $ this-> zip = new ZipArchive; extrait de fonction publique ($ source_file, $ dest_dir) if ($ this-> zip-> open ($ source_file) === TRUE) $ this-> zip-> extractTo ($ dest_dir); $ this-> zip-> close ();
Maintenant, allez-y et remplacez le télécharger
méthode dans votre Décompressez.php
contrôleur avec le suivant.
fonction publique upload () $ config ['upload_path'] = './uploads/'; $ config ['allowed_types'] = 'zip'; $ this-> load-> library ('upload', $ config); if (! $ this-> upload-> do_upload ('zip_file')) $ params = array ('error' => $ this-> upload-> display_errors ()); else $ data = array ('upload_data' => $ this-> upload-> data ()); $ full_path = $ data ['upload_data'] ['full_path']; $ this-> load-> library ('extracteur'); $ this-> extract-> extract ($ chemin_complet, FCPATH. '/ uploads /'); $ params = array ('success' => 'Extrait avec succès!'); $ this-> load-> view ('file_upload_result', $ params);
Comme vous pouvez le constater, nous avons chargé notre bibliothèque personnalisée et utilisée pour extraire le contenu.!
$ this-> load-> library ('extracteur'); $ this-> extract-> extract ($ chemin_complet, FCPATH. '/ uploads /');
Plutôt cool, hein?
Et oui, c'est la fin de cet article.
J'espère que vous avez apprécié cet article, dans lequel nous avons commencé à explorer la bibliothèque zip principale du framework CodeIgniter et les différentes manières de créer une archive zip. Dans la deuxième partie, j'ai expliqué comment décompresser des fichiers téléchargés par l'utilisateur à l'aide de l'extension PHP ZipArchive.
Au cours du processus, nous avons également eu la possibilité de convertir notre code en bibliothèque personnalisée CodeIgniter, ce qui est une cerise sur le gâteau, je dirais!
Faites-moi savoir si vous avez des questions ou des suggestions à utiliser à l'aide du flux ci-dessous..