[perl] ayuda en perl

Bolo Lacertus lacertus@servidor.unam.mx
Fri, 24 Mar 2000 15:18:18 -0600


Saludos!!!

Mmmm, ok, mando un script, basado en algo similar que hicimos en la UNAM
para publicar materiales sencillos, modificado para que que genere una
lista de registros de formato:

"campo1","campo2","campo3","campo4",imagen.ext

Las comillas son por seguridad ya que algunos DBMS las exigen, no le
pondré filtros para evitar las comillas en los campos, pero recomiendo
fuertemente que "limpies" las cadenas para evitar todo tipo de
caracteres indeseables.

Para simplificar aún mas el programa, le pongo que guarde solo cuatro
campos, literalmente "campo1","campo2","campo3","campo4" capturados en
la forma y un campo de tipo archivo de la misma.

El script va a necesitar que le cambies los nombres de los campos y que
le agreges mas en caso de que los necesites, pero en general debe jalar
bien (no lo he probado, pero es una versión reducida de uno que tenemos
en producción por lo que en el peor de los casos rompí algunos ciclos o
deje errores de sintaxis al eliminar cosas).

Sin embargo, esto hace todo lo que necesitas, agrego despues del script
nuestros segmentos de HTML como ejemplos de lo que abría que poner el
inircv.htmlp y finrcv.htmlp.

Carla Lorena Larios wrote:
> Necesito ayuda con  un rollo de un formulario en la web el cual debe
> capturar informacion, en texto y una
> famosa foto que los usuarios deben enviar..........

-------------inicia programa------------
#!/usr/bin/perl

# Programa recepcion de texto y archivos para presentacion por paginas
2.0
# Daniel Sol Llaven
# 25 de Abril del 2000

#Librerias
use CGI;
use rutinas;

#Variables de configuracion

#Localizacion de los archivos de salida.
#Directorio para poner las imagenes
$media="/usr/users/pumasi/html-docs/media";
#Archivo para colocar los registros
$registros="/usr/users/pumasi/registros.csv";


#Ok, nosotros solemos colocar el HTML que el CGI responde en arvhivos
# Separados de modo que luego sea mas facil cambiar el formato, a estos
# archivos los llamamos HTMLP

#Encabezado de respuesta (que estara bajo el directorio $textos)
$textos="/usr/users/pumasi/html-docs/htmlp";
$htmlpinicio="inircv.htmlp";
#Terminacion de respuesta (tambien bajo $textos)
$htmlpfin="finrcv.htmlp";

#inicialización del CGI
$def=new CGI;

#Verificación de parámetros
if(($def->param('campo1') eq "") ||($def->param('campo2') eq "")
    ||($def->param('campo3') eq "") ||($def->param('campo4') eq ""))
{
  #no se recibieron todos los campos del Resumen
  error(4,"Modo incorrecto de ejecutar el CGI");
}

if(!open(AE,"$textos/$htmlpinicio"))
{
  error(1,"Archivo de presentacion");
}

#Enviar el inicio de la forma
print "Content-type: text/html\n\n";
while(<AE>)
{
  print;
}
close AE;


#Recepcion del archivo
$archivo=$def->param('archivo');

if($archivo eq "")
{
  #error, no se entrego ningun archivo
  print "<h1>Error!</h1>El archivo no se recibi&oacute con &eacute;xito
o no ";
  print "se invoco el script de modo adecuado, por favor vuelva a
intentar, ";
  print "asegurandose de dar los datos correctos del
archivo<p>\n</body></html>";
  print $def->dump;
  exit;
}

print "El nombre del archivo enviado es <b>$archivo</b>";
if($archivo=~/^\//)
{
  print " y parece ser de\n<b>UNIX</b>";
}
else
{
  if($archivo=~/\w\:\\/)
  {
    print "y parece ser de\n<b>DOS</b>";
  }
}

#idealmente, se verifica el tipo del archivo, y en caso de ser texto se
# reformatea colocando los codigos adecuados. En este caso solo lo
guardamos
# es decir, suponemos archivo binario.

#obtener el nombre, sin extención.
if($archivo=~m/([\w\d]+)\.(\w+)/i)
{
  #tomar nomrbe y extención del archivo original, pero en minusculas
  $nombre=lc($1);
  $nombrefe=lc($2);
}
else
{
  #archivo enviado no reconocido como imagen
  error(1);
}

#Escribir el archivo recibido
#print "Archivo binario recibido<p>\n";
open(AS,">$media/$nombre.$nombrefe");

$cb=0;
while(read($archivo,$chrs,1024))
{
  #escribe bloques de 1024 caracteres a la salida hasta que haya error
  print AS $chrs;
  $cb++; #contador de bloques
}
close AS;
if($cb==0)
{
  #El archivo estaba vacio o no se recive por otro motivo.
  if(-z "$pathf")
  {
    print "rm $pathf<br>\n";
    system("rm $pathf");
  }
  error(6);  
}

#Datos de la forma
open(AD,">>$registros");
print AD "\"".$def->param('campo1')."\","\""
  .$def->param('campo2')."\","\""
  .$def->param('campo3')."\","\""
  .$def->param('campo4')."\",$nombre.$nombrefe\n";

#notese que el nombre del archivo no esta entre comillas y que no
incluye la
# ruta, ya que se considera como conocida al poner todas las imágenes en
el
# mismo directorio.

#Enviar la terminacion de la forma de respuesta
open(AE,"$textos/$htmlpfin");
while(<AE>)
{
  print;
}
close AE;

exit(0);

#Inicio de subrutinas
sub error
{
  #rutina que imprime los mensajes de error adecuados.
  @errores=("La extensi&oacuten del archivo enviado no corresponde con
un tipo valido de gráfica",
    "El nombre del archivo de texto es inválido, solo caracteres
alfanum&eacute;ricos por favor",
    "El archivo enviado como de texto contiene caracteres
inv&aacute;lidos",
    "Proporcione todos los datos para la ficha de resumen",
    "Error de base de datos",
    "El archivo enviado no tiene informaci&oacute;n"
  );
  #Se indica el error
  my($errno)=shift @_;
  $errno--;
  print "<B>ERROR</B><br>$errores[$errno]<p>";
  print "<u>Por favor regrese a la forma anterior y vuelva a
intentar</u><p>";
  # se termina la forma HTML
  print "$comando<br>\n"; #por si el error 5
  open(AE,"$textos/$htmlpfin");
  while(<AE>)
  {
    print;
  }
  close AE;
  exit(0);
}
-------------fin de programa------------

Archivos con el HTML que el CGI responde

------------inircv.htmlp------------
<HEAD><TITLE>Recepci&oacute;n de archivos</TITLE></HEAD>
<BODY BACKGROUND="/pumasi/media/WHITE5.GIF">
<TABLE WIDTH=87% ALIGN=RIGHT>
 <TR>
 <TD WIDTH=3% BGCOLOR="#E0B010"><FONT COLOR="#E0B010">1</FONT></TD>
 <TD WIDTH=1% BGCOLOR="#E0B010"><FONT COLOR="#E0B010">1</FONT></TD>
  <TD><FONT FACE="VERDANA"><FONT COLOR="#E0B010">
<H2>Proceso de recepci&oacute;n de archivos</H2></FONT>
En la recepci&oacute;n de su archivo enviado mediante HTTP:<p>
------------------------------------
------------finrcv.htmlp------------
<hr>
Sistema PUMASI, generado por 
<A HREF="http://132.248.71.81/cgi-bin/lacertus/hola">
Daniel Sol Llaven 1997</A>
</TABLE>
</BODY>
------------------------------------
-- 
Bolo Lacertus: lacertus@servidor.dgsca.unam.mx		==~\___\
http://proteo.dgsca.unam.mx/cgi-bin/lacertus/hola	 =__vvvv
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text   : unsubscribe perl