Alianwebserver.com

Retour au sommaire CGI

FAQ CGI

Voir aussi la FAQ Perl

Quelques URL :

Disponible également avec les ditributions de Perl

perlfaq9 Programmation réseau.

Comment configurer mon serveur Web pour reconnaitre les CGI Perl ?
VoirPerlwin32 faq6
Quand j'execute mon script, j'ai un "500 Internal Server"
Voir cette page pour les raisons les plus fréquentes.
Existe-t-il des hébergeurs gratuits pour les CGI ?
Faire une recherche sur http://www.freewebspace.net/ en spécifiant dans les options "CGI".
Où trouver des scripts CGI ?
Voici quelques sites ...
Comment tester ses scripts CGI en local ?
Voir cette page : Installation de l'environnement CGI
Comment connaitre le répertoire courant d'un script ?
  • Première méthode :
    #!/usr/bin/perl
    use CGI qw/:standard :html3 escape unescape/;
    use CGI::Carp qw/fatalsToBrowser/;
    print header,`pwd`;
    
  • Une autre, plus propre : (sans appel systême)
    #!/usr/bin/perl
    use CGI qw/:standard :html3 escape unescape/;
    use CGI::Carp qw/fatalsToBrowser/;
    use Cwd;
    print header,cwd;
    
Comment récupérer un fichier en dehors du serveur ?

- Par FTP : en utilisant le package net::FTP
Une fois installée voir perldoc net::FTP

use Net::FTP;
$ftp = Net::FTP->new("some.host.name");
$ftp->login("anonymous","mon@adresse.mail");
$ftp->cwd("/pub"); $ftp->get("/ce/repertoire/ce.fichier");
$ftp->quit; # Apres lire le fichier sur le disk local pour avoir le
contenu 

- Par HTTP : en utilisant le package LWP
Une fois installée voir perldoc LWP

use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);

# Creation d'une requete
my $req = new HTTP::Request POST 'http://www.perl.com/cgi-bin/BugGlimpse';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');

# On passe la requete à l'agent et on attend le résultat
my $res = $ua->request($req);

# Si le resultat est un succes (code HTTP 200) on affiche son contenu
if ($res->is_success) {print $res->content;}
# Sinon previent que URL defectueuse
else {print "Cette URL ne répond pas\n";} 

CGI Comment envoyer un fichier depuis un formulaire sur le serveur?

Vous devez utiliser un formulaire de ce type :

<form method="POST" ENCTYPE="multipart/form-data" 
action="...">
<input type="file" name="fichier">
</form>

Puis utilisez la libraire CGI.pm pour récupérer le fichier. Voir un exemple de son utilisation ici.

Et également perldoc CGI

CGI Récupérer diverses infos sur un utilisateur

#!/usr/bin/perl -w
print "Content-type:text/html\n\n";
while(my($n,$v)= each(%ENV)) {print "$n=$v
";} # Recuperer les infos qui vous # plaisent de %ENV dans $buf; my $buf =... open(MAIL,"|/usr/sbin/sendmail -t"); print MAIL "To: you\@adresse.com\n"; print MAIL "From: you\@adresse.com\n"; print MAIL "Subject: vos donnees\n"; print MAIL "X-Priority: 1 (Highest)\n\n"; print MAIL "Voici vos infos:$buf"; close(MAIL);

 

CGI ERROR: flock() unimplemented on this platform

Voila le reponse que j'obtiens losque je veux écrire des données dans un fichier texte.

ERROR: flock() unimplemented on this platform at c:/apache/cgi-bin/insert.pl line 23.

Lorsque que je suprime les 2 instructions fock de mon programme tout marche correctement, mais le problème, je crois, c'est que mon fichier txt n'est plus protégé contre l'ecriture pendant son traitement par un autre utilisateur.

Il est vrai que si vous otez les appels à flock le problême disparait puisque le probleme vient de là. Cela sert à verouiller le fichier le temps de son écriture. Le problême vient du fait que flock n'est pas disponible sur les plate-formes Windows ...

Comment faire un programme qui certe ne verrouillera pas sous Windows puisque non dispo mais le fera sur le serveur final qui lui est sous Linux ? (Ou comment faire un code portable ?) En mettant les appels à flock à l'intérieur d'un eval:

eval { flock(FILE,2); };

Comment faire sans ? Ben on peut pas ... sans bricoler. Disons que si le fait qu'il y est un double acces sur le fichier est un gros problême, c'est que la solution d'utiliser un fichier texte sur Windows pour les opérations d'écriture n'est pas la solution ! Soit changer de plateforme, soit utiliser une base de donnée qui va gérer les verrous.

Sinon donc on peut bricoler, mais ce n'est pas conseillé:

  1. On teste la présence d'un fichier c:\tmp\toto
  2. Si il existe on attend 2s (sleep(2);)et on reteste. Si il n'existe pas on le cree.
  3. On fait la modif dans le fichier guest.txt
  4. On supprime le fichier c:\tmp\toto

C'est du bricolage et ce n'est pas conseillé parce que si le processus est interrompu dans la phase 3, le fichier est vérouillé jusqu'à que qqn supprime manuellement le fichier c:\tmp\toto...