CGI Perl : créer une archive .tar.gz d'un dossier

CGI Perl : créer une archive .tar.gz d'un dossier - Perl - Programmation

Marsh Posté le 01-07-2009 à 16:55:58    

Hello aux habitués de la section.
 
Je cherche à créer un CGI qui permette de générer et de télécharger une archive contenant le contenu d'un répertoire, de préférence au format .tar.gz
 
Ce que je peux déjà faire :
 
Créer l'archive en question via le module Archive::Tar, placer le fichier à un endroit quelconque, puis faire un print de son contenu précédé des headers kivonbien pour forcer le téléchargement, puis effacer le fichier. Cette méthode marche, mais à l'inconvénient de laisser la page "tourner dans le vide" le temps de la création de l'archive (sans compter que parmi les utilisateurs il y aura probablement des bourrins du F5, ce qui pourrait conduire à la création de tonnes de fichiers temporaires).
 
 
 
Ce que je voudrais faire :
 
Créer l'archive "à la volée" sans création de fichier temporaire, et balancer le tout au navigateur. De préférence en même temps que l'archive se crée.
 
 
Est-ce possible, et si comment ?

Reply

Marsh Posté le 01-07-2009 à 16:55:58   

Reply

Marsh Posté le 01-07-2009 à 17:07:34    

Bah, perso, j'utiliserai la ligne de commande pour lancer "tar" pour compresser et générer l'archive en même temps. Cette commande doit pouvoir sortir le résultat directement sur la sortie standard. Balance les headers HTTP juste avant et voilà, plus de fichier temporaire.
 
Cela dit, cette méthode à une faille : il ne pourra pas y avoir de Content-Length (forcément). Du coup pas de progress bar dans le navigateur.

Reply

Marsh Posté le 01-07-2009 à 17:16:29    

Quelle serait la façon la plus "propre" de le faire ?
 
Balancer mes headers puis lancer le tar via un exec() pour pouvoir récupérer le contenu à la volée via la sortie standart ? Balancer la sortie du tar dans un pipe que je lirais ?

Reply

Marsh Posté le 01-07-2009 à 17:32:15    

Hmm, si tu lances tar avec une commande du genre "tar -zcf - dossier", la commande va tout te mettre sur la sortie standard, pas besoin de redirection, ni de pipe (si tu es dans un CGI).

Reply

Marsh Posté le 03-07-2009 à 15:21:15    

Merci, ca marche parfaitement.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use CGI;
  4. use Sys::Hostname;
  5. my $host = hostname;
  6. print "Content-Type:application/x-download\n"; 
  7. print "Content-Disposition:attachment;filename=etc-$host.tar.gz\n\n";
  8. system('tar -cz /etc');

Reply

Marsh Posté le 04-07-2009 à 22:44:43    

Et sinon, il y a le module Archive::Tar
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-07-2009 à 23:42:20    

Tout à fait, je m'en servais pour la première version de mon script.
 
Le souci concernait le fait que je n'ai pas su m'en servir sans créer de fichier temporaire, ce que je voulais éviter. Et le téléchargement aurait été "en attente" le temps que l'archive aie été créée dans son intégralité.
 
Je regarderai si c'est possible, je n'ai peut être pas bien compris la documentation de ce module.

Reply

Marsh Posté le 05-07-2009 à 04:16:16    

La méthode donnée en fin de module m'a paru assez exploitable
 

Citation :

Similarly, if the compress program is available, you can use this to write a .tar.Z file


Code :
  1. use Archive::Tar;
  2. use IO::File;
  3.  
  4. my $fh = new IO::File "| compress -c >$filename";
  5. my $tar = Archive::Tar->new();
  6.    ...
  7. $tar->write($fh);
  8. $fh->close ;


 
A+,


Message édité par gilou le 05-07-2009 à 04:17:29

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed