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 :

Probleme a l'usage de vars de CGI


Sujet :

Web Perl

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut Probleme a l'usage de vars de CGI
    Bonjour

    Je vous mets un extrait de mon code qui me permet de recuperer un upload de fichier juste avant de le reexpedier :
    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
     
    use CGI;
    use Fcntl qw(:DEFAULT :flock);
    use File::Temp qw/ tempfile tempdir /;
     
    open(TMP,">","$post_data_file") or &bye_bye ("Can't open temp file");
     
    my $i=0;
     
    $ofh = select(TMP); $| = 1; select ($ofh);
     
    while (read (STDIN ,$LINE, 4096) && $bRead < $len )
    {
    	$bRead += length $LINE;
     
    	select(undef, undef, undef,0.35);	# sleep for 0.35 of a second.
     
    	$i++;
    	print TMP $LINE;
    }
     
    close (TMP);
     
    open(STDIN,"$post_data_file") or &bye_bye("Can't open temp file");
     
    my $cg = new CGI();
    my $qstring="";
    my %vars = $cg->Vars;
    my $j=0;
     
    while(($key,$value) = each %vars)
    {
    	if(defined $value && $value ne '')
    	{	
    		my $fh = $cg->upload($key);
    		if(defined $fh)
    		{
    			#carp $fh;
    			($tmp_fh, $tmp_filename) = tempfile(DIR => $tmp_dir);
     
    			while(<$fh>) {
    				print $tmp_fh $_;
    			}
     
    			close($tmp_fh);
     
    			$fsize =(-s $fh);
     
    			$fh =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
    			$tmp_filename =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
    			$qstring .= "file[name][$j]=$fh&file[size][$j]=$fsize&";
    			$qstring .= "file[tmp_name][$j]=$tmp_filename&";
    			$j++;
    		}
    		else
    		{
    			$value =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
    			$qstring .= "$key=$value&" ;
    		}
    	}
    }
    Mon probleme se trouve a la reexpedition, en effet %vars est vide et dans le log d'erreurs apache j'ai :
    Premature end of script headers: /cgi-bin/upload.cgi
    CGI.pm: Server closed socket during multipart read (client aborted?).

    Etant debutant en perl j'ai repris ce code deja existant pour l'adapter mais je ne sais pas si il est correct.

    Voila le contenu du fichier $post_data_file recu :
    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
     
    -----------------------------5542324156557
    Content-Disposition: form-data; name="hidden"
     
    test
    -----------------------------5542324156557
    Content-Disposition: form-data; name="file_1"; filename=""
    Content-Type: application/octet-stream
     
     
    -----------------------------5542324156557
    Content-Disposition: form-data; name="file_2"; filename="Music.txt"
    Content-Type: text/plain
     
    Disco /Funk
    	YMCA
    	Patrick Hernandez
     
    Rock
    	Liquido
    	Nirvana
    	ACDC
    	Green Day
    	Noir Desir
    	Lenny Kravitz
     
    RnR
    	Chuck Berry
    	Dany Brillant - St Germain
    -----------------------------5542324156557--
    Merci de votre aide

  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
    Ce code fait des trucs assez bizarres... Pas incorrect à proprement parler mais...
    Quel est vraiment ton objectif ? Tu dis que tu veux renvoyer le fichier qui vient d'être uploadé, mais ça me semble un objectif assez bizarre, ne veux-tu pas le modifier entre temps ?


    --
    Jedaï

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    Le but general de mon projet est d'intercepter un upload de fichier par un formulaire pour le passer en tache de fond du navigateur, c'est a dire :
    Actuellement la validation du formulaire uploade le fichier (vers un index.php par exemple) et bloque la page.
    Je veux qu'a la validation un bout de code javascript dans ma page bloque le submit du formulaire et redirige le formulaire vers le .cgi afin de creer une barre de progression de l'upload (cette partie ne pose pas de probleme).

    J'avais trouve ce code qui (a mon avis) reception le formulaire, le stocke temporairement et le transfere finalement au index.php en creant un CGI mais comme cela se fait en local c'est rapide et transparent.

  4. #4
    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
    Résumons-nous : tu veux une barre de progression du téléchargement ? Et à la fin du téléchargement tu aimerais bien être redirigé vers une autre page ?

    --
    Jedaï

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    Pas tout a fait, j'essai de resumer :
    1 - soumission du formulaire par l'utilisateur
    2 - interception par javascript et redirection du formulaire au perl
    3 - perl recoit le fichier, et l'uploade
    3 bis - pendant ce temps javascript interoge php (en Ajax) qui transmet l'etat du telechargement ou la fin.
    4 - Le telechargement etant fini par perl il envoi au php tout le formulaire qui le traite.

    En fait je peux recuperer le contenu du fichier $post_data_file par le php mais il me manque les entetes a mon avis qui precise la valeur du boundarie etc... D'ou je me dis que le perl doit les avoir et redonner tout ca au php par l'intermediaire du CGI. Donc peut etre que le probleme provient des headers qui manquent dans le fichier $post_data_file

    Merci de ton aide Jedai, je suis peut etre sur la bonne piste mais j'ai encore besoin d'un tout petit coup de pouce

  6. #6
    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
    Pourquoi le 2 ? Il suffit de mettre le script CGI en action du formulaire.
    Pourquoi du PHP dans le 3 ?

    Pourquoi veux-tu mixer du PHP et du Perl ainsi ?

    --
    Jedaï

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    Cette application va se greffer sur un application existante :
    formulaire html => traitement php

    Il faut y intercaler une barre de progression dont la realisation n'est pas possible en php. Voila pourquoi je doit un peu me prendre la tete a mixer les technos.

    Sinon en perl il y a moyen d'ecrire les headers recu par le script dans un fichier ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    En creusant un peu, j'ai isolé mon probleme.

    Je rapelle que je cherche a traiter les données qui proviennent d'un formulaire. Pour ca l'utilisation de CGI est apparement la plus simple.
    Cependant je veux surveiller l'etat de l'upload, donc ecrire les données dans un fichier temporaire avant de lire le fichier vers STDIN et traiter les données par CGI.

    Et le code qui cloche est celui la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open(STDIN,"$post_data_file") or &bye_bye("Can't open temp file");
     
    my $cg = new CGI();
    my %vars = $cg->Vars;
    Je suis sous windows et il semblerait que le probleme vient de la, les headers ne sont pas correctement enregistrés donc le script perl echoue en ne trouvant pas les headers.

    Des idées pour resoudre cela ?

    Merci

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 101
    Par défaut
    finalement j'ai trouvé la solution, sous windows pour que le fichier temporaire soit correctement ecrit avec les bonnes entetes, il faut rajouter binmode(TMP) ; aprés le l'ouverture du fichier

    Merci Jedai pour ton aide

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

Discussions similaires

  1. probleme de confirmation d'utilisation d'un cgi
    Par tarentaise dans le forum Web
    Réponses: 5
    Dernier message: 31/07/2007, 12h53
  2. probleme d'espace avec une "var" :-(
    Par weldoo dans le forum Delphi
    Réponses: 9
    Dernier message: 30/07/2006, 20h41
  3. cgi, probleme bizarre
    Par djibril dans le forum Web
    Réponses: 16
    Dernier message: 07/04/2006, 09h45
  4. Bash CGI problème retour chariot
    Par ska_root dans le forum Linux
    Réponses: 4
    Dernier message: 22/02/2006, 12h17
  5. Réponses: 4
    Dernier message: 18/10/2005, 15h21

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