Ruby On Rails : gérer un zip

Il arrive parfois d’avoir besoin de retourner plusieurs fichiers lors de l’appel d’une action par exemple un csv avec des infos de base de données et des fichiers image associés à ces entrées en base de données.

Pour cela nous pouvons utiliser un zip dans lequel on mettra tous les fichiers nécessaires. Mais comment générer un zip depuis rails ? Ça tombe bien il existe une gem pour cela : rubyzip.

Regardons comment elle fonctionne sur un projet en rails 5 pour générer un zip puis le transmettre et lire son contenu dans une seconde action.

Pour l’exemple nous aurons un model article avec comme attribut un titre, un contenu, une date de publication et un champ nom_image. À ces articles sont associées des images qui sont stockées dans le dossier db/images/NOM_IMAGE

Première étape : Générer le zip

Pour cela nous allons installer la gem rubyzip avec un gem 'rubyzip' à mettre dans le gemfile puis un bundle install.

Maintenant nous allons déclarer une nouvelle action dans le contrôleur articles qui va utiliser cette gem pour créer un fichier zip avec à l’intérieur le csv des infos des articles et les fichiers associés à ces articles. Commençons par générer le CSV (de nombreuses façons sont possibles pour le faire) :

Pensez à mettre votre route comme suit :

get 'articles/exporter_zip'

La génération du csv est terminée.

Passons à l’ajout de ce csv à notre zip grâce à la gem rubyzip.

Pensez à inclure la librairie zip en mettant require 'zip' dans votre contrôleur.

Modifions maintenant notre méthode d’export comme suit :

Jusqu’ici pas de souci cela fonctionne bien.

Passons à l’ajout des fichiers images liés à nos articles.

Regardons comment modifier notre action :

Et voilà nous venons de créer un fichier zip que l’on transmet par la suite.

Si vous souhaitez que ce fichier soit temporaire nous verrons cela dans un prochain article sur les TempFile.

Seconde étape télécharger et extraire ce fichier

Pour cela nous allons créer pour l’exemple une seconde application de test qui ne fera que télécharger le fichier depuis la première application et extraire le zip pour pouvoir manipuler les fichiers qui sont à l’intérieur.

Dans cette application numéro 2 que nous appellerons APPLI2 nous n’aurons qu’une action dans l’application controller qui téléchargera le zip de puis la première application que nous appellerons APPLI1 et en extraira les fichiers.

Dans APPLI2 nous allons utiliser la gem rest-client.

On place donc gem 'rest-client' dans le gemfile puis un bundle install.

Définissons notre route get 'application/essai' puis notre action comme suit :

A ce moment là nous avons bien téléchargé le fichier zip et stocké ce dernier dans db/articles.zip

Maintenant lisons le fichier afin d’extraire les fichiers inclus dans le zip. Pour cela, ajoutez dans le gemfile gem 'rubyzip', faites un bundle install et ajoutez require 'zip' en haut du contrôleur application.

Modifions notre action :

Et voilà nous venons de voir comment manipuler des zip avec Ruby On Rails pour les émettre puis les traiter.

Enjoy 😉

3 réflexions au sujet de « Ruby On Rails : gérer un zip »

    1. Essai peut-être de mettre la boucle dans l’écriture du zip, tu éviteras ainsi l’ouverture multiples du fichier zip à écrire.

      Astuce non testée.

      Julien

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.