Página 1 de 1

upload cgi

NotaPublicado: 2011-03-31 15:04 @669
por panterozo
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.003 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.

Re: upload cgi

NotaPublicado: 2011-03-31 15:15 @677
por explorer
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.

Re: upload cgi

NotaPublicado: 2011-03-31 15:21 @681
por panterozo
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?

Re: upload cgi

NotaPublicado: 2011-03-31 16:10 @715
por explorer
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.002 segundos, usando GeSHi 1.0.8.4

Re: upload cgi

NotaPublicado: 2011-04-01 11:29 @520
por panterozo
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 ;)