Comment compresser et décompresser des fichiers dans CodeIgniter

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!

Comment compresser des fichiers?

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?

  • Ça va créer un fichier zip mon_info.zip sous votre répertoire uploads.
  • Il demandera également à un utilisateur de télécharger le fichier et le nom sous lequel le fichier sera enregistré est 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..

Comment décompresser des fichiers?

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!

Refactoriser le code de décompression dans une bibliothèque

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.

Conclusion

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..