• Publicidad

Eliminar espacios en blanco del nombre de archivo

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

Eliminar espacios en blanco del nombre de archivo

Notapor Alfumao » 2014-02-03 04:51 @244

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.003 segundos, usando GeSHi 1.0.8.4
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Eliminar espacios en blanco del nombre de archivo

Notapor explorer » 2014-02-03 08:22 @390

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar espacios en blanco del nombre de archivo

Notapor Alfumao » 2014-02-03 08:49 @409

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.
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Eliminar espacios en blanco del nombre de archivo

Notapor explorer » 2014-02-03 11:58 @540

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.002 segundos, usando GeSHi 1.0.8.4
Como ves, usamos el nombre que recibimos, lo filtramos, y lo usamos para abrir el archivo destino.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar espacios en blanco del nombre de archivo

Notapor Alfumao » 2014-02-04 02:54 @162

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!

;)
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514


Volver a Web

¿Quién está conectado?

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