|
Un cours pour débuter en Perl
Sous-sections
|
<HTML>
<!-- Source HTML permettant d'afficher le formulaire et
d'appeler la procédure CGI référencée par l'attribut
action de la balise <FORM>.
-->
<HEAD>
<TITLE> Test CGI </TITLE>
</HEAD>
<BODY>
<H1> Test CGI </H1>
<HR>
<FORM action="http://madeo.irisa.fr/cgi-bin/tstcgi"
method="POST">
Nom : <INPUT TYPE="text" NAME="nom" SIZE="25"> <BR>
Prénom: <INPUT TYPE="text" NAME="prenom" SIZE="15"> <BR>
<INPUT TYPE="submit" VALUE="OK">
<INPUT TYPE="reset" VALUE="Annuler">
</FORM>
<HR>
</BODY>
</HTML>
| |||
La première bibliothèque qui a été diffusée pour écrire des scripts CGI en Perl est cgi-lib.pl. Elle reste aujourd'hui très utilisée et présente les caractéristiques suivantes :
Le script Perl suivant propose d'utiliser cgi-lib.pl pour réaliser notre exemple, il utilise les fonctions suivantes :
#!c:\perl\bin\perl.exe
# TestCGI utilise cgi-lib pour acquerir les champs du
# formulaire et generer le HTML resultat. On verifie
# que la methode est POST, que les champs ne sont pas
# vides et on informe l'utilisateur du resultat.
require "cgi-lib.pl";
$champs= {}; # $champs est une reference sur un hash vide
if (MethPost()) {
ReadParse($champs);
if ($champs->{"nom"} eq "" || $champs->{"prenom"} eq "")
CgiDie("Il faut remplir les champs !");
}
print (PrintHeader(),
HtmlTop("Resultat de votre requete"),
"Nom : ", $champs->{"nom"}, "<BR>",
"Prenom :", $champs->{"prenom"}, "<BR>",
"vous utilisez $ENV{HTTP_USER_AGENT}",
"depuis la machine $ENV{REMOTE_ADDR}",
HtmlBot());
}
else {
CgiDie("Hum ... Que faites vous !");
}
| |||
#!c:\perl\bin\perl.exe
# TestCGI utilise CGI.pm pour acquerir les champs du
# formulaire et generer le HTML resultat. On verifie
# que la methode est POST, que les champs ne sont pas
# vides et on informe l'utilisateur du resultat.
use CGI;
$req = new CGI;
print $req->header();
print $req->start_html('Résultat de la requête');
if ($req->request_method() eq "POST") {
if ($req->param('nom') eq " " ||
$req->param('prenom') eq " " ) {
print $req->h1('Il faut remplir les champs');
}
else {
print ("Nom : ", $req->param('nom'),
$req->br,
"Prenom : ", $req->param('prenom'),
$req->br,
" vous utilisez", $req->user_agent(),
"depuis la machine ",$req->remote_addr());
}
}
else {
print $req->h1('Hum ... Que faites vous !');
}
print $req->end_html;
| |||
CGI.pm peut semble run peu plus lourd à utiliser que cgi-lib.pl, il est toutefois plus élaboré pour :
Il est parfois intéressant de transférer des documents complets depuis un client WWW vers un serveur HTTP. CGI.pm ainsi que cgi-lib.pl offrent cette possibilité. Elle s'appuie sur le transfert dans le corps d'un document (comprenant plusieurs parties), des champs éventuels d'un formulaire suivi des différents fichiers.
On peut compléter notre exemple en demandant à l'utilisateur de fournir deux fichiers qui seront transférés sur le serveur et transmis à notre script (via cgi-lib.pl ici). Le code HTML peut être modifié de la façon suivante :
<HTML>
<!-- Le document est composé de plusieurs parties, donc
(ENCTYPE="multipart/form-data") + ajout de 2 champs "file".
-->
<HEAD> <TITLE> Test CGI </TITLE> </HEAD>
<BODY>
<H1> Test CGI </H1><HR>
<FORM action="http://madeo.irisa.fr/cgi-bin/tfic.pl"
ENCTYPE="multipart/form-data" method="POST">
Nom : <INPUT TYPE="text" NAME="nom" SIZE="25"> <BR>
Prénom: <INPUT TYPE="text" NAME="prenom" SIZE="15"> <BR>
<INPUT TYPE="file" NAME="fic1" SIZE=50> <BR>
<INPUT TYPE="file" NAME="fic2" SIZE=50> <BR>
<INPUT TYPE="submit" VALUE="OK">
<INPUT TYPE="reset" VALUE="Annuler">
</FORM> </BODY> </HTML>
| |||
Dans le cas d'un type de document multipart/form-data les arguments de la fonction ReadParse sont 4 références à des tableaux associatifs correspondants aux champs du formulaire, aux nom des fichiers transmis, aux Content-Type des fichiers transmis et aux noms des fichiers reçus. Notre procédure peut donc être modifiée de la façon suivante :
#!c:\perl\bin\perl.exe
#
# Réception des deux fichiers.
require "cgi-lib.pl";
$champs = {}; # $champs, $client_fn,
$client_fn = {}; # $client_ct, $serveur_fn
$client_ct = {}; # sont des références sur
$serveur_fn = {}; # des hashes vides.
$cgi_lib::writefiles = "c:\tmp"; # Répertoire dans lequel
# les fichiers transmis
# seront déposés.
if (MethPost()) {
ReadParse ($champs, $client_fn, $client_ct, $serveur_fn);
if ($champs->{"nom"} eq "" || $champs->{"prenom"} eq "") {
CgiDie("Il faut remplir les champs !");
}
print (PrintHeader(),
HtnlTop("Resultat de votre requete"),
"Nom : ", $champs->{"nom"}, "<BR>",
"Prenom :", $champs->{"prenom"}, "<BR>",
$serveur_fn->{'fic1'}, # nom du fichier 1 (serveur)
$serveur_fn->{'fic2'}, # nom du fichier 2 (serveur)
$client_fn->{'fic1'}, # nom du fichier 1 (client)
$client_fn->{'fic2'}, # nom du fichier 2 (client)
$client_ct->{'fic1'}, # Content-Type fichier 1
$client_ct->{'fic2'}, # Content-Type fichier 2
HtmlBot());
# Une procedure opérationnelle pourrait maintenant ouvrir
# les fichiers correspondants et effectuer un traitement.
}
else {
CgiDie("Hum ... Que faites vous !");
}
| |||
Pour qu'une procédure effectuant du transfert de fichiers se déroule normalement, il convient que le serveur HTTP soit autorisé à écrire dans le répertoire $cgi_lib::writefiles, il faut également que celui-ci soit correctement dimensionné.
#!/usr/local/bin/perl
# TestCGI utilise CGI.pm pour acquerir les champs du
# formulaire et generer le HTML resultat. On verifie
# que la methode est POST, que les champs ne sont pas
# vides et on informe l'utilisateur du resultat.
use CGI::Fast;
$Cptr = 0;
while ($req=new CGI::Fast) {
$Cptr++;
print $req->header();
print $req->start_html('Résultat de la requête');
if ($req->request_method() eq "POST") {
if ($req->param('nom') eq " " ||
$req->param('prenom') eq " " ) {
print $req->h1('Il faut remplir les champs');
}
else {
print ("Requête numéro : ", $Cptr, $req->br);
print ("Nom : ", $req->param('nom'),
$req->br,
"Prenom : ", $req->param('prenom'),
$req->br,
" vous utilisez", $req->user_agent(),
"depuis la machine ",$req->remote_addr());
}
}
else {
print $req->h1('Hum ... Que faites vous !');
}
print $req->end_html;
}
| |||
|
|
|
|