• Publicidad

Upload y download formulario

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Upload y download formulario

Notapor apardo » 2009-04-01 02:46 @156

Hola a todos.

Soy nuevo en el foro. He caído aquí por casualidad pero es lo que más me está ayudando porque de Perl ni idea... y de inglés tampoco :)

A ver si alguien me puede ayudar: tengo un formulario que pide varios campos que los envío al servidor. En el servidor ejecuto un cgi que con los datos recibidos genera un fichero.

No sé cómo hacer para devolver el fichero generado al usuario para que haga download de ese archivo.

Y otra pregunta: si en el formulario incluyo un campo type="file", me despliega el browser para seleccionar el archivo, pero luego no sé como enviarlo al servidor y recogerlo en el cgi para tratar las variables por un lado y el fichero por otro.

¡¡Gracias anticipadas!!

saludos / Antonio
apardo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-03-31 16:58 @748

Publicidad

Notapor explorer » 2009-04-01 03:47 @199

Bienvenido a los foros de Perl en Español, apardo.

Bueno, aunque no sepas inglés, has usado algunas palabras en inglés, incluso en el título ;)

Para mandar un fichero al usuario, efectivamente tienes que mandar en la cabecera el tipo MIME del fichero, para que el navegador y el usuario sepa qué tipo de fichero es.

Y una vez enviada la cabecera, solo tienes que imprimir el fichero en la salida estándar del cgi, que estará conectada con el navegador del usuario.

Aquí tienes un ejemplo de un CGI que saca una imagen:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use CGI ':standard';

my $nombre_del_fichero = 'fichero.gif';

if (-e $nombre_del_fichero) {
    my $imagen;

    open    IMG, "<$nombre_del_fichero";
    binmode IMG;
    read    IMG, $imagen, -s $nombre_del_fichero;
    close   IMG;

    #print qq[Content-Type: application/gif\nContent-Disposition: attachment; filename="$nombre_del_fichero"\n\n];
    print header(
        -type       => 'application/gif',
        -attachment => $nombre_del_fichero,
    );
    binmode STDOUT;
    print $imagen;
}
else {
    print header, start_html('Error'), p('Error: no se encontró fichero'), end_html;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Primero comprobamos si el fichero existe o no.

Luego lo abrimos en lectura, indicamos con binmode() que lo vamos a leer en modo binario, y con read() lo leemos entero.

Luego, con header() sacamos la cabecera MIME. Y finalmente, la $imagen.

El uso del módulo CGI permite crear un código más corto. La línea del header() equivale a la línea de print() comentada justo encima.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2009-04-01 09:09 @423

Bienvenido de igual manera a los foros.

Para el upload de archivo, basta con ver nuestros tutoriales:
http://perlenespanol.com/tutoriales/cgi ... hivos.html

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor apardo » 2009-04-01 18:27 @810

Hola a todos.

Muchísimas gracias, kidd y explorer :D

Aún no los he probado pero creo que ¡¡es exactamente lo que necesito!!

Abusando, otra pregunta relacionada. En ambos ejemplos habla de ficheros binarios, en el tutorial de jpg, gif, etc.

En mi caso tanto el upload como el download ("touché", explorer :wink: ) son archivos de texto. ¿Sigo poniendo binmode(), o hay asciimode o algo así?

Lo dicho, muchas gracias / Antonio
apardo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-03-31 16:58 @748

Notapor explorer » 2009-04-01 18:32 @813

Si son texto, entonces no tienes que pasarlo a binario, excepto si no quieres que ocurran transformaciones en los caracteres de los finales de línea.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Algo me pasa con los números negativos

Notapor apardo » 2009-04-02 14:09 @631

Hola otra vez,

Lo primero de todo: seguí los pasos del tutorial para hacer el upload de un archivo ¡¡¡y me funciona perfecto!!!

Pero algo se me escapa al leer y tratar el fichero recibido mediante el upload. Transcribo el código de la rutina a ver si alguien me puede decir qué estoy haciendo mal, por más vueltas que le doy no lo veo:

El archivo subido es un archivo .kml, con sintaxis como la de XML.
Lo leo y me quedo sólo con la línea en que aparece "coordinates".

Son números, positivos o negativos, separados por comas.

Bien, la tabla me guarda los números, signo negativo incluido, pero cuando quiero trabajar con ellos, veo que los números negativos son 0.
En los primeros "print", veo los valores tal cual están en el archivo subido, pero en el segundo grupo de "print", los valores que son negativos me muestra 0, como si fuera una cadena de texto. (?)

¿Alguna sugerencia?
Gracias anticipadas / Saludos / apardo

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub Lee_Archivo {  # leemos el archivo kml y nos quedamos solo con las coordenadas
my @Tabla = ();
my @ParteCadena;
my $fichero = $camino1 . $archivo;
open (ARCHIVO_KML,$fichero) || die "ERROR_2: No se puede abrir el archivo". $fichero;
while (<ARCHIVO_KML>) {
  if ($_ =~ /coordinates/)     {
   @ParteCadena = split(/,/,$_);
   push(@Tabla, $ParteCadena[0]);
   push(@Tabla, $ParteCadena[1]);
  }
}
$long_sup_izda = $Tabla[0];
$lat_sup_izda  = $Tabla[1];
$long_inf_dcha = $Tabla[2];
$lat_inf_dcha  = $Tabla[3];
print $long_inf_dcha . " LONG_I_D \n";
print $long_sup_izda . " LONG_S_I \n";
print $lat_sup_izda  . " LAT_S_I \n";
print $lat_inf_dcha  . " LAT_I_D \n";

$long_sup_izda = $Tabla[0]*-1;
$lat_sup_izda  = $Tabla[1]*-1;
$long_inf_dcha = $Tabla[2]*-1;
$lat_inf_dcha  = $Tabla[3]*-1;

print $long_inf_dcha . " LONG_I_D ";
print $long_sup_izda . " LONG_S_I ";
print $lat_sup_izda  . " LAT_S_I ";
print $lat_inf_dcha  . " LAT_I_D ";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
apardo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-03-31 16:58 @748

Notapor explorer » 2009-04-02 16:03 @710

Lo más probable es que los valores almacenados en @Tabla no sean números de forma perfecta. Quiero decir que es posible que tenga algún carácter que impida su conversión a un número, por lo que al llegar a las líneas de multiplicación, Perl los convierte a cero.

Sería interesante ver un ejemplo de los datos de entrada.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor apardo » 2009-04-05 03:56 @206

Hola de nuevo,

Exacto, explorer, me estaba almacenando \t\t \tNUMERO en @Tabla. Gracias una vez más.

Bueno, ya lo tengo funcionando a mi gusto. He montado Apache en mi Netbook sobre WindowsXP y funciona correctamente.

He subido el formulario y el script al servidor y al ejecutar me da un error. He abierto un ticket de consulta y me responden esto:

Código: Seleccionar todo
We have investigate this issue for you and it appears that the the specified script could not be operational on our servers due to security reasons. As it is indicated via the error message:

Software error: CGI open of tmpfile: Read-only file system

If you upload a file, CGI tries to open a temporary file. That fails because the file system that CGI uses for temporary files is mounted as read-only. Unfortunately files with such permissions uploaded on our servers will not be operational. I am afraid that you will not be able to use such script with your account with us.


El upload del fichero es tal cual el tutorial que me indicó kidd.

Hasta aquí he llegado, ¿o se puede hacer de otra forma?

Gracias anticipadas / saludos / apardo
apardo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-03-31 16:58 @748

Notapor explorer » 2009-04-05 05:11 @258

apardo escribiste:me estaba almacenando \t\t \tNUMERO en @Tabla

Pues eso no lo entiendo porque entonces Perl debería haber hecho bien la conversión:
Código: Seleccionar todo
explorer@casa:~> perl -le '$Tabla[2]="\t\t \t1234"; print "[". (0+$Tabla[2]) ."]"; print "[" . ($Tabla[2]*-1) . "]"'
[1234]
[-1234]

En operaciones matemáticas, Perl intenta siempre extraer un número, y como ves, sí que le quita los tabuladores que le preceden.

Y lo otro, pues si en ese proveedor no se permite que los CGI escriban en el temporal, que te digan dónde pueden hacerlo. Y si no se puede hacer de ninguna manera, otra opción un poco más complicada sería a través de una base de datos. O cambiar de proveedor. O poner el servidor web en tu casa. Etc.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Gracias

Notapor apardo » 2009-04-06 05:11 @258

Hola de nuevo, Explorer.

De los números negativos, te copio como está ahora y me funciona correctamente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 while (<ARCHIVO_KML>) {
  if ($_ =~ /coordinates/)     {
   s/<coordinates>//;
   s/\t//;
   @ParteCadena = split(/,/,$_);
   push(@Tabla, $ParteCadena[0]);
   push(@Tabla, $ParteCadena[1]);
  }
 }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero no me pidas la explicación porque no sabría, jeje.

Bueno, lo importante, me he dado de alta en otro proveedor y el error es el mismo (bueno, los dos son gratuitos, no sé si influye).

Lo de hacerlo a través de la BBDD ya es demasiado para mí y lo de poner el servidor en mi casa me da verdadero pánico.

Así que como esto es en plan ocio, a los amigotes que quieran hacer lo mismo les diré que tienen que descargarse el Perl y Apache y ejecutarlo en modo local.

Ha sido un lujo entrar a este foro, aprender y obtener ayuda.

¡¡¡ Gracias !!!
apardo
apardo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-03-31 16:58 @748

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron