CGI: probleme html (firefox) et upload

CGI: probleme html (firefox) et upload - Perl - Programmation

Marsh Posté le 16-06-2005 à 10:38:21    

Bonjour à tous.
J'utilise un script perl pour recupérer les variables d'un formulaire afin ensuite d'executer des requetes via le module DBI de perl.
 
Cependant j'ai un petit problème avec Firefox à ce niveau:

Code :
  1. ######Création du fichier html de retour à l'execution du script perl
  2. print "content-type : text/html\n\n";
  3. print "<html><head><link rel='stylesheet' href='../public_html/leptostyle.css' type='text/css'></head>\n";
  4. print "<body><h1>Verification de l'insertion</h1>\n";
  5. print "<br><br>\n";
  6. print "<form method='post' action='../public_html/index.php?page=inserer'>\n";
  7. print "<input type='submit' value='Retour'></form>\n";
  8. print "toto\n";
  9. print "</body></html>\n";


 
Sous Internet Explorer, ma page html s'affiche correctement, le navigateur comprent le code html, tandis que sous firefox, il ne lie pas le code, il l'affiche juste.
Y-a t'il un probleme avec firefox et ce type d'utilisation?
Comment remédier à ce probleme?
Merci  :hello:


Message édité par suomi le 16-06-2005 à 17:07:54
Reply

Marsh Posté le 16-06-2005 à 10:38:21   

Reply

Marsh Posté le 16-06-2005 à 10:55:01    

il faut que tu indique le type de document que tu envoi.
en haut de ton scrip, le premier print doit etre:
print "Content-Type: text/html\n\n";
 
en fait IE a "deviné" qu'il s'agissait de HTML, mais normalement il aurait du faire comme firefox et l'afficher tel quel

Reply

Marsh Posté le 16-06-2005 à 10:56:23    

Tout d'abord, tu ferais mieux d'utiliser le module CGI en PERL, cela te faciliterait grandement la tache.
Voir : http://www.cpan.org
 
Ainsi, ton code avec le module CGI donnerait :

Code :
  1. use CGI (qw: standard);
  2. use strict;
  3. my $CGI = new CGI;
  4. print $CGI->header();
  5. print $CGI->start_html(-title => 'titre de la page',
  6.                        -style => '../public_html/leptostyle.css');
  7. print $CGI->h1('Verification de l'insertion'), $CGI->br();
  8. print $CGI->start_form( -name => 'nom_de_la_forme',
  9.                         -method => 'post',
  10.                         -action => '../public_html/index.php?page=inserer');
  11. print $CGI->submit( -name => 'nom_du_bouton', -value => 'Retour' );
  12. print "toto\n";
  13. print $CGI->end_form(), $CGI->end_html();


 
 
 
Ensuite, ta question est un problème HTML et non PERL. Ton script HTML regorge d'erreurs, par exemple le formulaire non terminé, pas de titre à la page, pas de nom de formulaire, et l'en-tête ne me parait pas correct.
Dans n'importe quelle page HTML, je vois plutôt un en-tête du style :
 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Reply

Marsh Posté le 16-06-2005 à 11:04:49    

pospos a écrit :

il faut que tu indique le type de document que tu envoi.
en haut de ton scrip, le premier print doit etre:
print "Content-Type: text/html\n\n";
 
en fait IE a "deviné" qu'il s'agissait de HTML, mais normalement il aurait du faire comme firefox et l'afficher tel quel


 
putain mais je vais pas bien moi en ce moment...
javais pas vu que le print text/html y etait deja...
 
desolé (remarque c'est peut etre un prob de majuscules? faut capitaliser Content-Type)

Reply

Marsh Posté le 16-06-2005 à 11:21:04    

pospos a écrit :

il faut que tu indique le type de document que tu envoi.
en haut de ton scrip, le premier print doit etre:
print "Content-Type: text/html\n\n";


 
J'ai donné ce renseignement.  :ange:  
 
 
 

Citation :

module CGI en PERL


Excuse moi Elmoricq, j'ai pas mit tout mon script perl car sinon ça aurait été trop big, mais j'utilise bien le module CGI, sans pour autant l'exploité comme toi.
Mon code html est effectivement très basic, mais c'etait juste pour un test. Par le biais de CGI Firefox et internet explorer fonctionne correctement.  
 
Merci  :jap:

Reply

Marsh Posté le 16-06-2005 à 11:25:12    

Tu est obliger de mettre des print a gogo dans ce cas la ?
Je ne connais pas perl, mais je trouve cela exessif pour un meme résultat.
 
print " code html " ;

Reply

Marsh Posté le 16-06-2005 à 11:36:31    

Badze a écrit :

Tu est obliger de mettre des print a gogo dans ce cas la ?
Je ne connais pas perl, mais je trouve cela exessif pour un meme résultat.
 
print " code html " ;


 
On peut même écrire ça de façon chouette de la manière suivante :
 

Code :
  1. print <<FIN_DE_BLOC
  2. ecrire
  3. ici
  4. absolument tout le
  5. html que
  6. l'on veut, le texte jusqu'à la ligne _COMMENCANT_ par FIN_DE_BLOC
  7. sera imprimé exactement tel quel
  8. FIN_DE_BLOC


 
:)

Reply

Marsh Posté le 16-06-2005 à 14:39:25    

Merci pour ce rappel Elmoricq, c'est vrai que c'est bien utile comme ça  :)  
 
Autre question... peut on faire du php à la place du html?
 
Car en fait, j'ai une page html composé d'un formulaire et d'un champ permettant l'upload d'un fichier. Lorsque je valide mon formulaire, je lance mon script perl qui récupère les variables de mon formulaire. Après un traitement de mes variables, mon script a besoin ensuite du fichier que j'ai uploadé. Avant j'utilisé une page php pour traiter l'upload:
 

Code :
  1. <?php
  2. // En PHP < 4.1.0, $HTTP_POST_FILES doit être utilisé
  3. //    à la place de $_FILES.
  4. $uploaddir = 'C:\Program Files\EasyPHP1-8\www\public_html\upload\\';
  5. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
  6. echo '<pre>';
  7. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
  8.    echo "Le fichier est valide, et a été téléchargé
  9.            avec succès. Voici plus d'informations :\n";
  10. } else {
  11.    echo "Attaque potentielle par téléchargement de fichiers.
  12.          Voici plus d'informations :\n";
  13. }
  14. //echo 'Voici quelques informations de déboguage :';
  15. //print_r($_FILES);
  16. echo '</pre>';
  17. ?>


 
D'ou ma question, est ce que je peux mettre ce code dans mon script perl pour permettre l'upload de mon fichier lors de la validité de mon formulaire?

Reply

Marsh Posté le 16-06-2005 à 14:42:06    

Oula suis fatigué, en fait je devrais plutot me tourner sur un moyen d'upload des fichier via perl... Une petit recherche s'impose....

Reply

Marsh Posté le 16-06-2005 à 14:43:14    

Pourquoi ne gères-tu pas l'upload directement dans ton script PERL ?
 
EDIT : alors pour gérer l'upload, il faut :
 
1. Déclarer le formulaire HTML en "multipart", avec la ligne suivante :
 

Code :
  1. print $CGI->start_multipart_form(-method=>"POST",
  2.                                       -action=>"ton_script.pl",
  3.                                       -name=>"id_du_formulaire" );


 
 
2. Déclarer un champ pour que l'utilisateur définisse le fichier à importer :

Code :
  1. print $CGI->filefield(-name=>'id_du_champ_fichier',-size=>50);


(il y a d'autres propriétés de disponible, je pense notament à un filtre d'extensions il me semble)
 
3. Récupérer le fichier si l'utilisateur a soumis le formulaire avec son fichier de défini :
 

Code :
  1. if ( defined $CGI->param('id_du_champ_fichier') )
  2. {
  3.    my $f_handler = $CGI->param('id_du_champ_fichier');
  4.    while ( <$f_handler> )
  5.    {
  6.       chomp;
  7.       # gerer les donnees lues
  8.    }
  9. }


 
 
 
Toute la documentation sur le module CGI est accessible sur le site de CPAN :
http://search.cpan.org/~jhi/perl-5.8.0/lib/CGI.pm


Message édité par Elmoricq le 16-06-2005 à 14:51:50
Reply

Marsh Posté le 16-06-2005 à 14:43:14   

Reply

Marsh Posté le 16-06-2005 à 17:07:04    

Merci Elmoricq pour ton aide mais se que tu me suggères ne correspond pas tout à fait à mes attentes.
Apres une petit recherche et quelques essais, voila ou j'en suis.
 
Mon formulaire de test:

Code :
  1. <HTML>
  2. <!-- Le  document est composé de plusieurs parties, donc
  3. (ENCTYPE="multipart/form-data" ) + ajout de 1 champs "file".
  4. -->
  5. <HEAD> <TITLE> Test CGI </TITLE> </HEAD>
  6. <BODY>
  7. <H1> Test CGI </H1><HR>
  8. <FORM action="/cgi-bin/tfic.pl"
  9.       ENCTYPE="multipart/form-data" method="post">
  10.   <INPUT TYPE="file" NAME="fic1" SIZE=50> <BR>
  11.   <INPUT TYPE="submit" VALUE="OK">
  12.   <INPUT TYPE="reset" VALUE="Annuler">
  13. </FORM> </BODY> </HTML>


 
 
Mon script .pl pour l'upload que je vais rajouter par la suite au reste de mon script perl:
 

Code :
  1. #!C:\Program Files\EasyPHP1-8\perl\bin\perl5.8.7.exe
  2. #
  3. #  Réception du  fichier.
  4. require "cgi-lib.pl";
  5.            #$client_fn,
  6. $client_fn = {};    # $client_ct, $serveur_fn
  7. $client_ct = {};    # sont des références sur
  8. $serveur_fn = {};   # des hashes vides.
  9. $cgi_lib::writefiles = "C:/Program Files/EasyPHP1-8/www/public_html/upload/";
  10. # Répertoire dans lequel les fichiers transmis seront déposés.
  11.              CgiDie;


Le script fonction sauf qu'au lieu de garder le nom du fichier, il change son nom du style:
cgi-lib.2016.1. Comment faire pour que le nom du fichier reste intact lors de l'upload?
Merci  :pt1cable:

Reply

Marsh Posté le 16-06-2005 à 17:18:14    

Code :
  1. require "cgi-lib.pl";


 
 [:le poney de mr pink]  
 
 
Ce module est dépassé et obsolète depuis... ouh la... trooooop longtemps !
 
Il faut utiliser CGI, et surtout pas cgi-lib, qui aurait dû se perdre dans les limbes de l'oubli voila quelques années.
 
Tiens, vu que CPAN a l'air de ne pas répondre aujourd'hui, j'ai trouvé la documentation en français, elle m'a l'air complète :
http://perl.enstimac.fr/ModulesFr/CGI.html


Message édité par Elmoricq le 16-06-2005 à 17:20:03
Reply

Marsh Posté le 16-06-2005 à 18:57:34    

Bon il existe un module CGI::upload:
 

Code :
  1. use CGI::Upload;
  2.      my $upload = CGI::Upload->new;
  3.      my $file_name = $upload->file_name('field');
  4.      my $file_type = $upload->file_type('field');
  5.      $upload->mime_magic('/path/to/mime.types');
  6.      my $mime_type = $upload->mime_type('field');
  7.      my $file_handle = $upload->file_handle('field');


 
Maintenant comment l'utiliser avec un formulaire envoyé par html? ça je ne sais pas trop...

Reply

Sujets relatifs:

Leave a Replay

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