IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web Perl Discussion :

Zipper et télécharger à la volée


Sujet :

Web Perl

  1. #1
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut Zipper et télécharger à la volée
    Salut,

    Je suis à la recherche d'un ptit script qui me permette de zipper un fichier, de télécharger l'archive et de supprimer l'archive du serveur. L'application que je bricole est une application web qui tourne sur un serveur linux. Malheureusement, je débute en perl et ça dépasse de loin mes compétences. Quelqu'un aurait une solution?

    Merci.

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu crées l'archive puis tu l'envoies au client en n'oubliant pas d'envoyer un header avec un Content-Type approprié avant. Pour créer l'archive, soit tu utilises un outil externe, soit tu utilises l'un des modules de Perl fait pour ça si tu peux l'installer. Je te conseille de ne pas passer par un fichier intermédiaire, mais de directement utiliser un pipe (si processus externe) ou une variable scalaire. Evidemment il pourrait être plus avisé de mettre en place un système de cache. A toi de voir.

    --
    Jedaï

  3. #3
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    Merci, Jedaï...
    Créer l'archive ne pose pas le moindre problème, linux offre assez de possibilité de ce côté. Par contre
    tu l'envoies au client en n'oubliant pas d'envoyer un header avec un Content-Type approprié avant
    m'est assez abstrait.

  4. #4
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    en cherchant, j'ai trouvé ce bidule mais ça ne fonctionne pas, quelqu'un sait me dire pourquoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $nom_fichier="/usr/.../log/server.log.gz"; 
    print "header('Content-disposition: attachment; filename='".$nom_fichier."'); ";
    print "header('Content-Type: application/force-download'); ";
    print "header('Content-Transfer-Encoding: 'application/x-gzip'\n'); ";
    print "header('Pragma: no-cache'); ";
    print "header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); ";
    print "header('Expires: 0'); ";
    Merci.

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Le content-type indique le type MIME du contenu envoyé après le header HTTP, ça permet au client de traiter de façon approprié ce que tu lui envoies, par exemple text/html lui dit qu'il doit le traiter comme du HTML, text/plain comme du texte brut, application/x-pdf comme un pdf (par exemple l'ouvrir avec le plugin acrobat reader).
    Dans ton cas, il faut lui dire de quel type d'archive il s'agit (et déjà lui dire qu'il s'agit d'une archive, donc de données binaires, sinon il risque de le corrompre en le traitant comme du texte).

    Ton script CGI devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #!C:/Lang/Perl/bin/perl
    use strict;
    use warnings;
    use CGI;
    use Compress::Zlib;
     
    use CGI::Carp qw/fatalsToBrowser/;
     
    my $q = new CGI;
     
    # plutôt à récupérer depuis un fichier de config si possible
    my $server_root = '/www';
     
    my $filename = $q->param('filename');
     
    # une vérification très prudente de ce que tu veux autoriser s'impose,
    # ici je ne fais qu'une vérification bien insuffisante
    # ce serait plus prudent de ne réserver cette possibilité qu'à
    # un répertoire de ton serveur, choisi soigneusement
    if (    $filename =~ m{[^/]$}
        and $filename !~ m{(?:\.php.?|\.cgi|\.htaccess)$}
        and $filename =~ m{^(/[-\w_/\.]*)$} )
    {
        $filename = $server_root . $1;
    }
    else {
        signal_fatal_problem();
    }
     
    my ($shortname) = ( $filename =~ m{.*/([^/]+)$} );
     
    open my ($file_to_zip), '<', $filename
      or signal_fatal_problem();
     
    print $q->header( -type => 'application/x-gzip',
        -attachment => "$shortname.gz" );
     
    binmode STDOUT;
    my $gz = gzopen( \*STDOUT, "wb" )
      or die "Cannot open stdout: $gzerrno\n";
     
    while (<$file_to_zip>) {
        $gz->gzwrite($_)
          or die "error writing: $gzerrno\n";
    }
     
    $gz->gzclose;
     
    sub signal_fatal_problem {
        print $q->header(), $q->start_html('Erreur de nom de fichier'),
          $q->p(
            "Le fichier $filename que vous avez demandé n'est",
            ' pas disponible pour le téléchargement en tant ',
            ' qu\'archive, ou n\'existe pas.'
          ),
          $q->end_html();
     
        # je te conseille de loguer ce genre de tentatives
        # ça sera instructif sur les risques de ce genre d'approche
        exit(0);
    }
     
    __END__
    --
    Jedaï

  6. #6
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut
    C'est super, merci... Avec la bonne lib, c'est impecable...

  7. #7
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Il faut avoir Compress::Zlib, et changer le $server_root.

    --
    Jedaï

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Si tu n'as pas Compress::Zlib et que tu ne peux pas l'installer, tu peux toujours utiliser un outil externe, mais le reste de la structure sera identique.

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. zipper des fichiers/Appli à la volée?
    Par dexys dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/08/2010, 07h46
  2. Où télécharger XMLRAD 2006 ?
    Par RDM dans le forum XMLRAD
    Réponses: 0
    Dernier message: 24/01/2003, 17h57
  3. [Kylix] composants à télécharger de kylix
    Par yacomor dans le forum EDI
    Réponses: 2
    Dernier message: 15/10/2002, 19h48
  4. [Kylix] Télécharger Kylix 3 Open Edition
    Par RDM dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2002, 11h28
  5. Réponses: 0
    Dernier message: 07/05/2002, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo