OVH Cloud OVH Cloud

transfert d'un fichier vers un script CGI

4 réponses
Avatar
opal7313
Bonjour je suis en train de faire une petite interface mais je ne
connais pas encore bien le cgi.
Expliquons d'abord ou j'en suis: j'ai fait une 1ere page en HTML:
<HTML>
<TITLE>Y X Interface</TITLE>
<BODY BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#660099"
ALINK="#660099">
<map name=img_map>
<area shape=rect coords=2,1,250,21 href="http://www.X.com">

</map>
<img USEMAP=#img_map WIDTH=250 HEIGHT=21 SRC="images/logo-print.gif"
ISMAP>

<form ACTION="y.cgi" METHOD = POST NAME="MainY" ENCTYPE=
"multipart/form-data">

<P>
Enter sequence file in FASTA format from disk
<INPUT TYPE="file" NAME="SEQFILE">
<P>
<a href="OPTIONS.html">Choose option(s)</a>
<td><input name="IPR" type="checkbox" class="text" value="-ipr">-ipr
</td>
<td><input name="GO" type="checkbox" class="text" value="-go">-go
</td>
<td><input name="SCR" type="checkbox" class="text" value="-scr">-scr
</td>
<td><input name="CSC" type="checkbox" class="text" value="-csc">-csc
</td>
<P>
<td><input name="TR_T:" type="checkbox" class="text"
value="-tr_T">-tr_T ;</td> which NN <INPUT TYPE="text" NAME="NN1"
SIZE=2>
<td><input name="TR_L:" type="checkbox" class="text"
value="-tr_T">-tr_L :</td> which NN <INPUT TYPE="text" NAME="NN2"
SIZE=2>
<P>

<a href="DATA.html">Choose data</a>
<select name = "DATALIB">
<option value ="-all"> all
<option value= "-d BlastProDom" > prodom
<option value= "-d Coil" > coil
<option value= "-d FPrintScan" > prints
<option value= "-d HMMPIR" > HMMPIR
<option value= "-d HMMPfam" > HMMPfam
<option value= "-d HMMSmart" > HMMSmart
<option value= "-d HMMTigr" > HMMTigr
<option value= "-d ProfileScan" > ProfileScan
<option value= "-d ScanRegExp" > ScanRegExp
<option value= "-d Seg" > Seg
<option value= "-d SUPERFAMILY " > SUPERFAMILY
</select>
<P>

<INPUT TYPE="submit" VALUE="Search">
<INPUT TYPE="Reset" VALUE="Erase" >
</form>
<HR>
<ADDRESS>
Comments and suggestions to:&lt; <a
href="mailto:opal7313@yahoo.fr">Helpdesk@X.com</a> &gt
</ADDRESS>
<BR>
<!-- Created: today -->
<!-- hhmts start -->
Last modified: 01/07/2004
<!-- hhmts end -->
</BODY>
</HTML>

Donc ceci envoie le fichier(j'espere) et les options dans une seconde
application.
Cette seconde application est x.cgi en voici le script pour l'instant
(loin d'estre final car j'ai qques lacunes en CGI):

#!/usr/bin/perl -w

use strict;
use CGI;

my $q;
my $query;
my $adress;

#start of html page
print "Content-type: text/html\r\n\r\n";
print "<head>\n";
print "<title>Interpro : Intermediary page</title>\n";
print "</head>\n";
print "<!-- Background white, links blue (unvisited), navy (visited),
red (active) -->\n";
print "<body bgcolor=#FFFFFF text=#000000 link=#0000FF vlink=#000080
alink=#FF0000>\n";
print "<b><font size =6>Y <font color=#FF0000 size=6>X</font>
Interface</b></font>\n<P>";

#use of transfered datas
$query=new CGI;

my $value1 = $query->param('SEQFILE');<= Est ce juste le nom du
fichier comme il apparait ou le fichier entier que je rappelle la?

my $value2 = $query->param('IPR');
my $value3 = $query->param('GO');
my $value4 = $query->param('SCR');
my $value5 = $query->param('CSC');
my $value6 = $query->param('TR_T');
my $value7 = $query->param('TR_L');
my $value8 = $query->param('DATALIB');
my $value0 = $query->content('SEQFILE');<-PAS SUR

print "<b>Let see characteristics of your query </b>: $value0,
$value2, $value3, $value4, $value5, $value6, $value7, $value8,<P>\n ";
print "<P><font color=#33CC99>y is working...Step 1 </font><P>\n";

#ici je pensais recuperer les données pour les metre sur mon disque et
ainsi pouvoir les re-utiliser quand je voulais?? .... Apparemment ce
n'ai pas ca!!
while (<$value0>) {
my $line=$_;
open (INTERM, ">tmp.txt");
print INTERM "$line\n";
close INTERM
}
#execution of the y perl script; ici je veux executer le script
yscan.pl avec les options recuperees de la premiere page et reprendre
les donnees qui en découlent dans out.txt...
system ("perl", "/Users/X/Yy/yscan.pl", "tmp.txt", $value2, $value3,
$value4, $value5, $value6, $value7, $value8) || die "There is a
problem of system!";
open (IN,"<out.txt");
print "<P><font color=#333399>y is working...Step 2 </font><P> \n";
while (<IN>) {
my $line=$_;
#use of the particular adress of this work
foreach ($line){
if (/^cd\s+tmp+(.+)/) {
$1= $adress;
}
#execution of shell commands
system ($line) || die "There is a problem with the other system";
}
}
print "<P><font color=#330066>y Work is finished, click here to see
result (do not forget to register it on your disk; for other format
-excel,...- contact <a
href=mailto:opal7313@yahoo.fr>HelpDesk</a>):</font><P>\n";
#redirect people through the result page
print "<a href= /Library/WebServer/Documents/TEST/tmp/$adress>RESULTS
</a>";
system ("rm", out.txt)
close IN;

Donc comme vous pouvez le constater je suis un peu perdu car je
voulais recuperer le fichier pour l'utiliser dans ce sript et je ne
l'ai pas! Que me manque t il?!

Que dois je faire pour que ceci soit "un plan sans accroc"!!!

Merci de me repondre si vous voyer mon probleme ou s'il a besoin
d'eclaicissement!

Helen

4 réponses

Avatar
root
On Fri, 09 Jan 2004 06:11:45 -0800, lynn wrote:

Bonjour je suis en train de faire une petite interface mais je ne
connais pas encore bien le cgi.
Expliquons d'abord ou j'en suis: j'ai fait une 1ere page en HTML:
<HTML>
[...]
</HTML>

Donc ceci envoie le fichier(j'espere) et les options dans une seconde
application.
Cette seconde application est x.cgi en voici le script pour l'instant
(loin d'estre final car j'ai qques lacunes en CGI):

#!/usr/bin/perl -w

use strict;
use CGI;

my $q;
my $query;
my $adress;

#start of html page
print "Content-type: text/htmlrnrn";
print "<head>n";
print "<title>Interpro : Intermediary page</title>n";
print "</head>n";
print "<!-- Background white, links blue (unvisited), navy (visited),
red (active) -->n";
print "<body bgcolor=#FFFFFF text=#000000 link=#0000FF vlink=#000080
alink=#FF0000>n";
print "<b><font size =6>Y <font color=#FF0000 size=6>X</font>
Interface</b></font>n<P>";

#use of transfered datas
$query=new CGI;

my $value1 = $query->param('SEQFILE');<= Est ce juste le nom du
fichier comme il apparait ou le fichier entier que je rappelle la?



Normalement c'est le nom du fichier mais aussi un descripteur de fichier
ouvert sur ce fichier... Mais il me semble qu'il y a eu du changement à
ce sujet suivant la version de CGI.pm que tu utilises. Perso j'utilise la
methode upload() voir ci-dessous.

my $value2 = $query->param('IPR');
my $value3 = $query->param('GO');
my $value4 = $query->param('SCR');
my $value5 = $query->param('CSC');
my $value6 = $query->param('TR_T');
my $value7 = $query->param('TR_L');
my $value8 = $query->param('DATALIB');
my $value0 = $query->content('SEQFILE');<-PAS SUR

print "<b>Let see characteristics of your query </b>: $value0,
$value2, $value3, $value4, $value5, $value6, $value7, $value8,<P>n ";
print "<P><font color=#33CC99>y is working...Step 1 </font><P>n";

#ici je pensais recuperer les données pour les metre sur mon disque et
ainsi pouvoir les re-utiliser quand je voulais?? .... Apparemment ce
n'ai pas ca!!
while (<$value0>) {
my $line=$_;
open (INTERM, ">tmp.txt");
print INTERM "$linen";
close INTERM
}


tu peux utiliser la methode upload() pour récuperer un descripteur de
fichier ouvert sur le fichier SEQFILE :

my $fh = $query->upload( "SEQFILE" ) or die "Erreur SEQFILE : $!n";
open( INTERM, ">", "tmp.txt" ) or die "Erreur INTERM : $!n";
print INTERM $_ while( <$fh> );
close INTERM;

#execution of the y perl script; ici je veux executer le script
yscan.pl avec les options recuperees de la premiere page et reprendre
les donnees qui en découlent dans out.txt...
system ("perl", "/Users/X/Yy/yscan.pl", "tmp.txt", $value2, $value3,
$value4, $value5, $value6, $value7, $value8) || die "There is a
problem of system!";
open (IN,"<out.txt");
print "<P><font color=#333399>y is working...Step 2 </font><P> n";
while (<IN>) {
my $line=$_;


Tu peux directement faire :

while( my $line = <IN> ) {

#use of the particular adress of this work
foreach ($line){


Ton foreach est inutile ici.
Foreach sert a parcourir les elements d'une liste, dans ton cas tu as
une liste avec un seul element qui est le scalaire $line. Ça reviens
donc à faire "$_ = $line" alors que tu viens de faire "$line = $_" dans
la ligne au dessus...

if (/^cds+tmp+(.+)/) {
$1= $adress;


C'est pas plutôt $adress = $1 que tu veux faire ? capturer le (.+) et le
mettre dans $adress ?

}
#execution of shell commands
system ($line) || die "There is a problem with the other system";
}
}
print "<P><font color=#330066>y Work is finished, click here to see
result (do not forget to register it on your disk; for other format
-excel,...- contact <a
href=mailto:HelpDesk</a>):</font><P>n";
#redirect people through the result page
print "<a href= /Library/WebServer/Documents/TEST/tmp/$adress>RESULTS
</a>";
system ("rm", out.txt)
close IN;



Avatar
opal7313
Meci pour ces precisions!!

Mais j'ai encore un probleme surement stupide mais qui ne me saute pas
aux yeux: en effet quand j'execute Y.html avec un ficher sur mon Y.cgi
nouveau (voir suite) je n'obtient pas ce que je souhaite: je n'ai pas
la copie escompte sur mon disque mais il est bien la lorsque je
l'edite sur cette fenetre html intermediaire.

#!/usr/bin/perl -w

use strict;
use CGI;

my $q;
my $query;
my $adress;

#start of html page
print "Content-type: text/htmlrnrn";
print "<head>n";
print "<title>Y : Intermediary page</title>n";
print "</head>n";
print "<!-- Background white, links blue (unvisited), navy (visited),
red (active) -->n";
print "<body bgcolor=#FFFFFF text=#000000 link=#0000FF vlink=#000080
alink=#FF0000>n";
print "<b><font size =6>Y Interface</b></font>n<P>";

#use of transfered datas
$query=new CGI;

my $value1 = $query->param('SEQFILE');
my $value2 = $query->param('IPR');
my $value3 = $query->param('GO');
my $value4 = $query->param('SCR');
my $value5 = $query->param('CSC');
my $value6 = $query->param('TR_T');
my $value7 = $query->param('TR_L');
my $value8 = $query->param('DATALIB');
print "<b>Let see characteristics of your query </b>: $value1,
$value2, $value3, $value4, $value5, $value6, $value7, $value8,<P>n ";
print "<P><font color=#33CC99>Y is working...Step 1 </font><P>n";

#copy of the transfered file

open (INTERM,">","/Users/X/Desktop/$value1");<= N'ouvre apparemment
pas le fichier souhaite
while (<$value1>) {
#my $line=$_;
print INTERM "$_n";<= n'edite pas le texte dans ce fichier par
consequence
print "$_n";<íite parfaitement les ligne du fichier transfere sur
la page cgi
}
#my $fh = $query->upload( "SEQFILE" ) or die "Erreur SEQFILE : $!n";
# open( INTERM, ">", "/Users/X/Desktop/$value1" ) or die "Erreur
INTERM : $!n";
# print INTERM $_ while( <$fh> );
# print "$_n";
# close INTERM;
Malheuresement le reste du script depend du bon fonctionnement de
cette premiere partie ce qui n'es pas le cas!!!


#execution of the interpro perl script
system ("/usr/bin/perl", "/Library/WebServer/Documents/TEST/y.pl",
"/Users/X/Desktop/$value1", $value2, $value3, $value4, $value5,
$value6, $value7, $value8) || die "There is a problem of system!";
open (IN,">out.txt");
print "<P><font color=#333399>Interpro is working...Step 2 </font><P>
n";

#use of the particular adress of this work
while (<IN>) {
my $line=$_;
if (/^cds+tmp+(.+)/) {
$adress = $1;
print "$adressn";
}
#execution of shell commands
system ($line) || die "There is a problem with the second shell
commends";
}

print "<P><font color=#330066>Y Work is finished, click here to see
result (do not forget to register it on your disk; for other format
-excel,...- contact <a
href=mailto:HelpDesk</a>):</font><P>n";

#redirect people through the result page
print "<a href= /Library/WebServer/Documents/TEST/tmp/$adress>RESULTS
</a>";
close INTERM;
close IN;

Encore merci d'avance
Je boue de ne pas voir pourquoi!!!

Lynn
Avatar
root
On Mon, 12 Jan 2004 04:33:34 -0800, lynn wrote:

Meci pour ces precisions!!

Mais j'ai encore un probleme surement stupide mais qui ne me saute pas
aux yeux: en effet quand j'execute Y.html avec un ficher sur mon Y.cgi
nouveau (voir suite) je n'obtient pas ce que je souhaite: je n'ai pas
la copie escompte sur mon disque mais il est bien la lorsque je
l'edite sur cette fenetre html intermediaire.

#!/usr/bin/perl -w

use strict;
use CGI;

my $q;
my $query;
my $adress;

#start of html page
print "Content-type: text/htmlrnrn";
print "<head>n";
print "<title>Y : Intermediary page</title>n";
print "</head>n";
print "<!-- Background white, links blue (unvisited), navy (visited),
red (active) -->n";
print "<body bgcolor=#FFFFFF text=#000000 link=#0000FF vlink=#000080
alink=#FF0000>n";
print "<b><font size =6>Y Interface</b></font>n<P>";

#use of transfered datas
$query=new CGI;

my $value1 = $query->param('SEQFILE');
my $value2 = $query->param('IPR');
my $value3 = $query->param('GO');
my $value4 = $query->param('SCR');
my $value5 = $query->param('CSC');
my $value6 = $query->param('TR_T');
my $value7 = $query->param('TR_L');
my $value8 = $query->param('DATALIB');
print "<b>Let see characteristics of your query </b>: $value1,
$value2, $value3, $value4, $value5, $value6, $value7, $value8,<P>n ";
print "<P><font color=#33CC99>Y is working...Step 1 </font><P>n";

#copy of the transfered file

open (INTERM,">","/Users/X/Desktop/$value1");<= N'ouvre apparemment
pas le fichier souhaite


Le serveur Web a t'il bien les droits d'écriture dans ce repertoire
/Users/X/Desktop ?

if( ! open(INTERM, ">", "/Users/X/Desktop/$value1") ) {
print "<b>Erreur ouverture INTERM : $!</b>";
exit 1;
}

Tu peux aussi regarder dans les fichiers de logs (`error_log' pour Apache)
du serveur web, si tu y a accès, pour voir d'eventuels messages d'erreurs...



Sinon, une remarque question « sécurité » :
Il ne faut jamais utiliser le nom de fichier reçu par upload !!!

Ce nom de fichier peut être n'importe quoi, comme par exemple :
../../../etc/password

qui donnerait donc dans ton open() :
/Users/X/Desktop/../../../etc/password

et au final ouvrirait l'accès au fichier :
/etc/password

Une personne pourrait ainsi écrire dans n'importe quel fichier
accessible en écriture par le serveur web en uploadant simplement un
fichier avec un nom forgé de cette sorte.

Pour éviter cela, tu peux utiliser le module File::Temp pour créer tes
fichiers temporaires ("perldoc File::Temp") plutôt que d'utiliser cette
concatenation.

while (<$value1>) {
#my $line=$_;
print INTERM "$_n";<= n'edite pas le texte dans ce fichier par
consequence
print "$_n";<íite parfaitement les ligne du fichier transfere sur
la page cgi
}
#my $fh = $query->upload( "SEQFILE" ) or die "Erreur SEQFILE : $!n";
# open( INTERM, ">", "/Users/X/Desktop/$value1" ) or die "Erreur
INTERM : $!n";
# print INTERM $_ while( <$fh> );
# print "$_n";
# close INTERM;
Malheuresement le reste du script depend du bon fonctionnement de
cette premiere partie ce qui n'es pas le cas!!!


#execution of the interpro perl script
system ("/usr/bin/perl", "/Library/WebServer/Documents/TEST/y.pl",
"/Users/X/Desktop/$value1", $value2, $value3, $value4, $value5,
$value6, $value7, $value8) || die "There is a problem of system!";
open (IN,">out.txt");
print "<P><font color=#333399>Interpro is working...Step 2 </font><P>
n";

#use of the particular adress of this work
while (<IN>) {
my $line=$_;
if (/^cds+tmp+(.+)/) {
$adress = $1;
print "$adressn";
}
#execution of shell commands
system ($line) || die "There is a problem with the second shell
commends";
}

print "<P><font color=#330066>Y Work is finished, click here to see
result (do not forget to register it on your disk; for other format
-excel,...- contact <a
href=mailto:HelpDesk</a>):</font><P>n";

#redirect people through the result page
print "<a href= /Library/WebServer/Documents/TEST/tmp/$adress>RESULTS
</a>";
close INTERM;
close IN;

Encore merci d'avance
Je boue de ne pas voir pourquoi!!!

Lynn


Avatar
opal7313
Bonjour,

En effet après examen du error_log, il s'agit bien de defaut de
permission pour INTERM je vais donc rechercher comment changer ceci
tout en concervant un certaine sécurité à l'ensemble; merci pour les
petites remarques en plus, je me suis empressee de les suivre!

Si vous avez des solutions simples a ce probleme je suis preneuse!!

Lynn