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 :

Problème dans CGI


Sujet :

Web Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Problème dans CGI
    Salut ,
    Je m'y connais très peu en PERL (oui je suis plutot PHP).
    Mais j'ai installer un script PERL pour uploader des fichiers avec une barre de progression.
    Ca marche nikel.
    Maintenant j'ai voulu modifié un peu le truc pour adapter à mes besoins.
    En fait je veut que le mec qui upload un fichier aille dans un dossier qui porte le nom de son login (oui sur un espace membres donc :-) )

    donc déjà dans le formulaire html je rajoute un paramètre dans l'adresse destination upload.cgi?upload_id='+UID+'&login=toto

    Ca ça marche nikel. Passons maintenant au fichier upload.cgi dont voici les sources :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    #!/usr/bin/perl
    ### XUpload v2.5
    ### SibSoft.net (26 Jan 2006)
    use strict;
    use CGI::Carp qw(fatalsToBrowser);
    use CGI qw/:standard/;
    use XUploadConfig;
    #$CGI::close_upload_files = $CGI::CLOSE_UPLOAD_FILES = 1; #works for 1 file only (prob:reusing file handler)
    $CGI::POST_MAX = 1024 * $c->{max_upload_size};   # set max Total upload size
    my $sid = (split(/[&=]/,$ENV{QUERY_STRING}))[1]; # get the random id for temp files
    $sid ||= join '', map int rand 10, 1..7;         # if client has no javascript, generate server-side
    &xmessage("Invalid Upload ID") unless $sid=~/^\d+$/; # Checking for invalid IDs
    my $temp_dir = "$c->{temp_dir}/$sid";
    mkdir $temp_dir;
    my $mode = 0777;
    chmod $mode,$temp_dir;
    # Tell CGI.pm to use our directory based on sid
    $CGITempFile::TMPDIRECTORY = $TempFile::TMPDIRECTORY = $temp_dir;
     
    # Remove all files if user presses stop
    sub CleanUp
    {
       &DelData($temp_dir);
       exit(0);
    }
     
    $SIG{HUP} = 'IGNORE';
    local $SIG{__DIE__} = 'CleanUp';
    if($ENV{'CONTENT_LENGTH'} > 1024*$c->{max_upload_size})
    {
       &lmsg('ERROR: Maximum upload size exceeded<br>You should stop transfer right now');
       sleep 1;
       &DelData($temp_dir);
       &xmessage("Maximum upload size exceeded");
    }
    else
    {
       open FILE,">$temp_dir/flength";
       print FILE $ENV{'CONTENT_LENGTH'}."\n";
       close FILE;
       my $mode = 0777; chmod $mode,"$temp_dir/flength";
    }
    my $cg = new CGI;
    if( $cg->cgi_error() )
    {
       &DelData($temp_dir);
       &xmessage("ERROR: Maximum upload size exceeded");
    }
    my (@fileslots,@filenames,@file_status);
    my @params = $cg->param;
     
    #Mon ajout pour récupérer le paramètre Login
    my $login = $cg->param('login');
    my $target_dir = "$c->{target_dir}/$login";
     
    #Je test si la variable est bien récupérée (effectivement les résultats dans 
    #le fichier n'affiche que le target_dir d'origine sans le $login)
    open(FILE,">>/var/tmp/log.txt");
    print FILE $target_dir."\n";
    close FILE;
     
    for my $k ( keys %{$cg->{'.tmpfiles'}} )
    {
       $cg->{'.tmpfiles'}->{$k}->{info}->{'Content-Disposition'} =~ /name="(.+?)"; filename="(.+?)"/;
       my ($field_name,$filename) = ($1,$2);
     
     
       $filename =~ s/.*\\([^\\]*)$/$1/;
       push @fileslots, $field_name;
       push @filenames, $filename;
       $filename=~ /(.+)\.(.+)/;
       my ($fn,$ext) = ($1,$2);
       if($ext !~ /^$c->{ext_allowed}$/i)
       {
          &lmsg("MSG:File $filename have unallowed extension!");
          push @file_status, "unallowed extension";
          next;
       }
       $fn = substr($fn,0,$c->{max_name_length});
       my $i;
       $i++ while (-e "$target_dir/$fn$i.$ext" && $c->{copy_mode} eq 'Rename');
       $filename="$fn$i.$ext";
       push @file_status, "OK. renamed to:$fn$i.$ext" if $i;
       &lmsg("MSG:File '$fn.$ext' already exist!<br>New file saved as '$filename'.") if $i;
       if(-e "$target_dir/$filename" && $c->{copy_mode} eq 'Warn')
       {
          &lmsg("MSG:File $filename already exist! New file wasn't saved.");
          push @file_status, "error:filename already exist";
          next;
       }
     
       &SaveFile2( ${$cg->{'.tmpfiles'}->{$k}->{name}}, $target_dir, $filename );
       push @file_status, "OK" unless $i;
    }
     
    ### Small pause to sync messages with pop-up
    select(undef, undef, undef,0.1);
    &DelData($temp_dir);
    &DeleteOldTempFiles;
    print"Content-type: text/html\n\n";
    ### Sending data with POST request if required
    my $url_post = $cg->param('url_post');
    $url_post ||= $c->{url_post};
    if($url_post)
    {
       my ($str,@har);
       for (0..$#fileslots)
       {
          push @har, { name=>$fileslots[$_],          'value'=>$filenames[$_] };
          push @har, { name=>"$fileslots[$_]_status", 'value'=>$file_status[$_] };
       }
       for my $k (@params)
       {
          my @arr = $cg->param($k);
          for my $p (@arr)
          {
             next if ref $p eq 'Fh'; #&& $p !~ /\.$c->{ext_allowed}$/i; # Skip unallowed files
             $p =~ s/.*\\([^\\]*)$/$1/;
             push @har, { name=>$k, value=>$p };
          }
       }
       push @har, { name=>'target_dir', value=>$target_dir };
       print"<HTML><BODY onLoad='document.F1.submit();'><Form name='F1' action='$url_post' target='_parent' method='POST'>";
       print"<textarea name='$_->{name}'>$_->{value}</textarea>" for @har;
       print"</Form></BODY></HTML>";
       exit;
    }
    ### Upload finished, redirecting 
    my $redirect_link = $cg->param('redirect_link');
    $redirect_link ||= $c->{redirect_link};
    print"<HTML><Script>parent.document.location='$redirect_link';</Script></HTML>";
    #############################################
    sub DeleteOldTempFiles
    {
       my @ff;
       opendir(DIR, $c->{temp_dir}) || &xmessage("Can't opendir temporary folder: $!");
       @ff = readdir(DIR);
       closedir(DIR);
       foreach my $fn (@ff)
       {
          next if $fn =~ /^\.{1,2}$/;
          my $file = $c->{temp_dir}.'/'.$fn;
          my $ftime = (lstat($file))[9];
          my $diff = time() - $ftime;
          next if $diff < $c->{temp_files_lifetime};
          -d $file ? &DelData($file) : unlink($file);
       }
    }
    sub SaveFile2
    {
       my ($temp,$dir,$fname) = @_;
       rename($temp,"$dir/$fname");
    }
    sub DelData
    {
       my ($dir) = @_;
       opendir(DIR, $dir) || die"Error2";
       my @ff = readdir(DIR);
       closedir(DIR);
       for my $fn(@ff)
       {
          unlink("$dir/$fn");
       }
       rmdir("$dir");
    }
    sub xmessage
    {
       my ($msg) = @_;
       print"Content-type: text/html\n\n";
       print"<HTML><BODY><b>$msg</b><br><input type='button' value='&lt; Back' onclick='javascript:history.go(-1);'></BODY></HTML>";
       exit;
    }
    sub lmsg
    {
       my ($msg) = @_;
       open(FILE,">>$temp_dir/flength");
       print FILE $msg."\n";
       close FILE;
    }
    Voila ce qui est en rouge c'est ce que j'ai rajouté.
    Le problème c'est que le $login reste vide. Donc l'upload reste dans le target_dir d'origine.
    Par ailleurs si j'utilise la fonction
    &xmessage("le rep de destination est $target_dir");
    Ben ça affiche bien le target_dir avec le $login.

    Merci de votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    bon j'ai pas mal chercher et je pense que l'erreur vien peut être de la page du formulaire. Je m'explique.
    Quand je rentre l'adresse "upload.cgi?upload_id=111111&login=pingoo" dans la barre d'adresse, alors, le cgi récupère bien le login dans la variable $login.
    ALors que si je passe par le formulaire il récupère pas.
    Voila la source du formulaire :

    <Script language="JavaScript">
    var exts = "jpg|gif|png|bmp|mp3|mpg|mpeg|avi|rar|zip|7z|gz|txt";
    //var exts = ".*"; //Use this to accept all Extensions
    var UID,NF=0,cx=0;
    function openStatusWindow()
    {
    if(document.F1.popup.checked == true)
    {
    win1 = window.open('/cgi-bin/upload_status.cgi?upload_id='+UID+'&num_files='+NF+'&css_name='+document.F1.css_name.value+'&tmpl_name='+document.F1.tmpl_name.value,'win1','width=320,height=240,resizable=1');
    win1.window.focus();
    }
    }
    function generateSID()
    {
    UID = Math.round(10000*Math.random())+'0'+Math.round(10000*Math.random());
    var f1=document.F1;
    f1.action = f1.action.split('?')[0]+'?upload_id='+UID+'&login=pingoo';
    //for (var i=0;i<document.F1.length;i++)
    //{
    // current = document.F1.elements[i];
    // if(current.type=='file' && current.value!='')NF++;
    //}
    }
    function StartUpload()
    {
    NF=0;
    for (var i=0;i<document.F1.length;i++)
    {
    current = document.F1.elements[i];
    if(current.type=='file' && current.value!='')
    {
    if(!checkExt(current.value))return false;
    NF++;
    }
    }
    generateSID();
    openStatusWindow();
    }
    function checkExt(value)
    {
    if(value=="")return true;
    var re = new RegExp("^.+\.("+exts+")$","i");
    if(!re.test(value))
    {
    alert("Extension not allowed for file: \"" + value + "\"\nOnly these extensions are allowed: "+exts.replace(/\|/g,',')+" \n\n");
    return false;
    }
    return true;
    }
    </Script>
    </HEAD>
    <BODY>
    <center>
    <h2>XUpload demo page</h2>
    <form name="F1" enctype="multipart/form-data" action="/cgi-bin/upload.cgi?upload_id=" method="post" onSubmit="return StartUpload();" target="upload">
    <div id="slots"></div>
    Send file: <input name="file1x" type="file" onChange="checkExt(this.value)"><br>
    <br>
    Comment:<br>
    <textarea name="commentxy" cols="30" rows="5" wrap="virtual" valign="top">
    This is a test field to show sending POST request to external script.
    You can use any number or all form elements.
    </textarea>
    <br><br>
    <Input type="checkbox" name="popup" checked id="popup"><label FOR="popup" ACCESSKEY="Z">Show upload status in pop-up window</label><br>
    <br>
    <input type="submit" value="Upload Files">
    <input type="hidden" name="css_name" value="">
    <input type="hidden" name="tmpl_name" value="">
    <br><br>
    </form>
    Du coup c'est peut être plus sur le forum javascript que je trouverais de l'aide.

  3. #3
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    intéressant de voir que ton login passe en GET alors que ton formulaire est en POST...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    lol oki, quand tu le dit ça à l'air tout bête mais faut dire que je connais pas grand chose en perl. En php je peut récupérer en faisant un GET car il est dans l'adresse du lien.

    Mais vu que j'y connais rien en PERL, je ne sais pas comment récupérer la variable d'un POST. Je vais chercher.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    et hop une petite recherche et en fait pour récupérer un paramètre d'url dans un formulaire en POST il fallait que je fasse :

    my $login = $cg->url_param('login');
    au lieu de

    my $login = $cg->param('login');
    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/09/2007, 12h14
  2. problème dans l'hebergement
    Par Redouane dans le forum ASP
    Réponses: 9
    Dernier message: 31/12/2003, 23h34
  3. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09
  4. Problème dans analisys Manager
    Par ien_ien23 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/07/2003, 14h38
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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