Página 1 de 1

Eliminar espacios en blanco del nombre de archivo

NotaPublicado: 2014-02-03 04:51 @244
por Alfumao
Buenos días.

Tengo un problema con los CGI de Perl de una página web que he creado. Cuando el usuario sube un archivo con espacios en blanco en el nombre, el CGI no reconoce el archivo y da error.

¿Hay alguna solución sencilla para eliminar los espacios en blanco y renombrar el fichero sin usar módulos? Como por ejemplo:

use File::Copy qw(move);

Aquí os dejo el código que escribí, pero que no puedo usar, porque el servidor no me deja instalar el módulo mencionado anteriormente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Getopt::Long;
  5. use File::Copy qw(move);
  6. #Usage: perl /path/Rename.pl -f nombre archivo
  7.  
  8. my ( $file, $index);
  9. GetOptions(
  10.     'file=s'         => \$file,
  11.     );
  12. (my$renamed=$file)=~ s/\s/\_/g;
  13. print "$file changed to $renamed\n";
  14. move ($file, $renamed) or die(qq{failed to move $file -> $renamed});
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Eliminar espacios en blanco del nombre de archivo

NotaPublicado: 2014-02-03 08:22 @390
por explorer
¿En qué momento da el error de la subida del archivo? ¿Cuando está bajando o cuando lo estás copiando a su sitio definitivo? Yo supongo que estás usando el código que hemos comentado en otras ocasiones. En ese caso, ¿dónde se produce el error? Fíjate que en el código hay un if(), un open(), y el fallo puede aparecer en cualquiera de ellos.

Yo supongo que el fallo está en el open(), al intentar escribir en un archivo que se llame igual al nombre del archivo que el usuario envía.

Pero aún así, no debería a ver problemas: open() solo eliminará los espacios en blanco que estén por delante o por detrás del nombre:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. explorer:~/Documentos/Desarrollo> perl -E 'open F, "> Hola Adios "; say F "Hola"; close F' 
  2. explorer:~/Documentos/Desarrollo> ll Hola\ Adios  
  3. -rw-r--r-- 1 explorer users 5 feb 3 14:18 Hola Adios 
  4. explorer:~/Documentos/Desarrollo> 
Fíjate que hay espacios en medio, por delante y detrás del nombre del archivo, y open() crea el nombre correcto en el sistema (respetando el espacio en blanco de en medio).

En cuanto al módulo File::Copy, creo que debería estar ya instalado por defecto, en Perl.

Re: Eliminar espacios en blanco del nombre de archivo

NotaPublicado: 2014-02-03 08:49 @409
por Alfumao
No sé si me he explicado bien, lo que pasa es que si el archivo que suben tiene espacios en el nombre, el CGI deja de funcionar. Lo he probado emulando el servidor en (WAMPP)y en un sistema Linux y el mismo archivo sin espacios en el nombre funciona, pero con espacios en el nombre no...

He buscado en Google y hay más gente que habla de esto, pero proponen soluciones en PHP, ninguna en Perl, aparte de la que puse en el script del mensaje de inicio del hilo.

Resumiendo, se trata de renombrar el archivo eliminando los espacios en blanco una vez "uploaded" al servidor.

Re: Eliminar espacios en blanco del nombre de archivo

NotaPublicado: 2014-02-03 11:58 @540
por explorer
Sería algo así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $archivo    = $cgi->param ('file');            # nombre del archivo que recibimos
  2. my $archivo_fh = $cgi->upload('file');            # gestor del archivo que estamos recibiendo
  3.  
  4. $archivo =~ s/ +/_/g;                             # cambiamos los conjuntos de espacios, por caracteres '_'
  5.  
  6. $archivo = "\Q$archivo";                          # "escapamos" el resto de caracteres peligrosos, con caracteres '\'
  7.  
  8. # el archivo ya estaba abierto, y podemos leerle con $archivo_fh
  9. # usaremos el nuevo nombre de $archivo para grabar el resultado
  10.  
  11. # el gestor puede ser indefinido, si no es un gestor de archivo válido
  12. if (defined $archivo_fh) {
  13.  
  14.     # Actualizamos el gestor de archivo a uno compatible con IO::Handle
  15.     my $io_handle = $archivo_fh->handle;
  16.  
  17.     open (OUTFILE, '>', '/home/alfumao/test/$archivo');      # archivo donde guardaremos el archivo que hemos recibido
  18.     my $buffer;
  19.     while (my $bytesleidos = $io_handle->read($buffer,1024)) {
  20.         print OUTFILE $buffer;
  21.     }
  22.     close OUTFILE;
  23. }
  24. else {
  25.     warn "ERROR: no tenemos un gestor de archivo válido"
  26. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Como ves, usamos el nombre que recibimos, lo filtramos, y lo usamos para abrir el archivo destino.

Re: Eliminar espacios en blanco del nombre de archivo

NotaPublicado: 2014-02-04 02:54 @162
por Alfumao
Muchas gracias, explorer.

Justo de camino a casa me dí cuenta de que nosotros le damos nombre al archivo al subirlo y que ahí se podría modificar, y lógicamente al llegar al trabajo, tú ya me habías dado la misma solución (pero bastante mejor explicada, ¡ja,ja,ja,ja)!

¡QUÉ GRANDE ERES!

;)