• Publicidad

upload cgi

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

upload cgi

Notapor panterozo » 2011-03-31 15:04 @669

Estimados.. tengo el siguiente código whois.pl:


En $datos{'userfile'} obtengo la información de la dirección del archivo... (no aparece la ruta entera... no sé si esto es relevante...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ruta = "/var/www/cgi-bin";# ruta a donde va a ir el archivo
  2. my $nombre_en_servidor = $datos{'userfile'};
  3. $nombre_en_servidor =~ s/ /_/gi;
  4. $nombre_en_servidor =~ s!^.*(\\|\/)!!;
  5. if($nombre_en_servidor =~ /\.txt$/){
  6.     open (OUTFILE, ">$ruta/$nombre_en_servidor") || die "No se puedo crear el archivo";
  7.     binmode(OUTFILE); #Para no tener problemas en Windows
  8.     #Transferimos byte por byte el archivo
  9.     while (my $bytesread = read($datos{'userfile'}, my $buffer, 1024)) {
  10.         print "Subiendo archivo";
  11.         print OUTFILE $buffer;
  12.     }
  13. #Cerramos el archivo creado
  14. close (OUTFILE);
  15. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4



He estado toda la tarde tratando de subir el archivo .txt :s... Crea el documento en la carpeta, pero no la información en él.

El error.log de Apache dice:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
read() on unopened filehandle at /var/www/cgi-bin/whois.pl line 51., referer: http://localhost/staff/seleccion.php?lista=Whois
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



La linea 51 es la del while... ¿qué estoy haciendo mal?.. ¡¡¡¡ayuda!!!!
Ya no sé que más pueda ser.
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: upload cgi

Notapor explorer » 2011-03-31 15:15 @677

read() no funciona así.

Si ejecutas perldoc -f read verás que el primer argumento de read() no es el nombre del fichero, sino el controlador del fichero abierto, así que eso significa que ANTES deberás abrirlo con open(), y usar el controlador creado ahí con el read().

Y, en los casos de CGI, a veces es necesario dar la ruta completa al fichero que quieres crear.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: upload cgi

Notapor panterozo » 2011-03-31 15:21 @681

El ejemplo lo saqué de http://perlenespanol.com/tutoriales/cgi/upload_de_archivos.html.

Seguiré intentando...

Utilizando el mismo cgi http://perlenespanol.com/tutoriales/cgi/upload_de_archivos.html, sube los archivos al servidor, ya sean gif, jpeg, etc... pero al hacer ls -la da:

-rw-r--r-- 1 www-data www-data 0 2011-03-31 16:42 imagen.jpeg
-rw-r--r-- 1 www-data www-data 0 2011-03-31 16:52 Dominios.txt
-rw-r--r-- 1 www-data www-data 0 2011-03-31 16:51 latin_america_map.gif


Vacíos... no sé en qué está fallando...

También he cambiado los permisos, etc...
¿Alguna idea?
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: upload cgi

Notapor explorer » 2011-03-31 16:10 @715

Pues yo creo que el ejemplo del tutorial está mal. Las quejas, a kidd.

En cuanto a los ficheros: tienen tamaño cero porque ese es el efecto del open().

Lo que está fallando es el read().

Es recomendable mirar la sección PROCESSING A FILE UPLOAD FIELD del módulo CGI, que explica todas las posibilidades que el módulo da para subir ficheros.

Editado Te pongo los pasos básicos (sacado del último programa que he hecho. Faltan muchas líneas, solo están las interesantes):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use CGI ':standard';
  2. use File::Slurp;
  3.  
  4. my $cgi = CGI->new;
  5. my $fichero = $cgi->param('foto');            # param() nos da el nombre completo del fichero
  6.  
  7. if ($fichero  and  chdir $directorio) {       # si el usuario nos pasó un fichero y podemos entrar en $directorio
  8.     my $fh = $cgi->upload('foto');            # obtenemos el controlador de acceso al fichero en el fichero subido
  9.     if ($fh) {                                # si podemos leerlo...
  10.         my $imagen = read_file( $fh, binmode => ':raw' ) ;  # nos lo leemos a memoria (somos muy chulos :)
  11.        
  12.         my $foto = 'foto001';                 # creamos un nombre nuevo para la foto
  13.         ++$foto while -e "$foto.jpg";         # buscamos un nombre que todavía no exista
  14.         my $foto_org = "${foto}_org.jpg";     # la foto original la guardaremos con .org al final
  15.         $foto .= '.jpg';                      # la foto resultado será jpeg
  16.  
  17.                                               # grabamos la $imagen a disco, con nombre $foto_org
  18.         write_file( $foto_org, {binmode => ':raw'}, $imagen );
  19.  
  20.         # Informar al usuario
  21.         say $cgi->header,
  22.             $cgi->start_html('Foto recibida'),
  23.             $cgi->h2('Foto recibida'),
  24.             $cgi->p("¡¡¡Gracias por el envío, $nombre!!!"),
  25.             $cgi->hr,
  26.             $cgi->pre($salida),
  27.             $cgi->end_html,
  28.             ;
  29.     }
  30. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: upload cgi

Notapor panterozo » 2011-04-01 11:29 @520

Esta bueno el ejemplo explorer ;)...

El problema no estaba en el tutorial, sino que era en el envío en el form que estaba realizando... Los envíos en el formulario tienen que ser por POST, de otra manera, no se puede obtener el controlador del archivo.

Gracias por la ayuda ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400


Volver a Web

¿Quién está conectado?

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