Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Problemas con upload de archivos Help [Resuelto] Responder al tema
Nuevo tema


Página 1 de 1  [ 14 mensajes ] 
 
Nota 2008-03-14 03:29 @186

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
Problemas con upload de archivos Help [Resuelto]
Hola buenos días, tardes o noches.

Bueno, estoy en este foro por un problemita que me surgió al hacer upload de archivos con Perl ya que no me dejó subir el servidor con otra cosa... así que tuve que recurrir a métodos alternativos en el cual caí a este foro :P, me gustaría que me ayudaran con la consulta, y la consulta es la siguiente.

Tengo una página web donde se suben archivos; en ésta, por medio de radio buttons escogen 3 opciones, una de estas opciones tiene otra pequeña lista donde se selecciona otra subopción; esta información que se selecciona antes es para saber, digamos, en qué carpeta se guardará el archivo.

Ahora, después de seleccionar esto se utiliza una forma para subir el archivo (utilizé el script de esta página), que mostraré más o menos la forma, dependiendo del botón que seleccionen y el estado de los radio, inserto o elimino algunas cosas. El problema radica en que en ciertos momentos me lo hace y en otros no y qué mejor el ejemplo para que lo vean xD que chance y ni me explique bien así que pongo más o menos el código.

Mención: "soy novato, ja". Perdón si está largo el post :( (Se va detallando el problema abajo)

Código
Syntax: [ Download ] [ Hide ]
  1. form action="util/archivo.pl" method="post" enctype="multipart/form-data" onsubmit="return valida_Forma()" name="Envio" > 
  2. <div class="post"> 
  3. <h2 class="title">Subir un Archivo</h2> 
  4. <div class="entry"> 
  5. <strong>Tipo de documento</strong>
     
  6.  
  7. <input type="radio" name="docTipo" checked="checked" value="Primeras" onclick="toggle_estados(this)" /> Primera Plana
     
  8. <input type="radio" name="docTipo" value="Columnas" onclick="toggle_estados(this)" /> Columna
     
  9. <input type="radio" name="docTipo" value="Estados" onclick="toggle_estados(this)" /> Estado de la Republica <br/  
  10. <div id="div_estados" style="display:none">  
  11. <select name='MEstados' multiple='false'>No hay estados disponibles.
    </select>  
  12. <span> 
  13. <strong>Agregar un Estado:</strong>
     
  14. <input type="text" name="newEstado" size="30" maxlength="30" class="inputColor"> 
  15. <input type="submit" name="btn_Accion" value="Agregar" class="boton" />  
  16. </span>  
  17. <span> 
  18. <strong>Eliminar Estados Seleccionados</strong> 
  19. <input type="submit" name="btn_Accion" value="Eliminar" class="boton" /> 
  20. </span>  
  21. </div>  
  22. </div> 
  23. </div> 
  24. <div class="post"> 
  25. <h2 class="title">Seleccione el documento</h2> 
  26. <div class="entry"> 
  27. <strong> Cambiar el nombre del documento: </strong>
     
  28. <input type="text" name="cadenatexto" size="50" maxlength="100" class="inputColor" /> 
  29. <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> <!-- 10 megas --> 
  30. <strong>Subir un nuevo archivo: </strong>  
  31. <input name="userfile" type="file" size="50"/> 
  32. <input type="submit" name="btn_Accion" value="Enviar" class="boton" />  
  33. </div> 
  34. </div> 
  35. </form> 

Y ahora especifico el código modificador de perl como dios me dio a entender XD (está basado en el ejemplo de aquí):

Código
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
########################################################
#
# "Upload de archivos"
#
# Creado por: Uriel Lizama
# Todos los derechos reservado.
#
# <!-- m --><a class="postlink" href="http://perlenespanol.baboonsoftware.com/">http://perlenespanol.baboonsoftware.com/</a><!-- m -->
#
#########################################################

use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;

#iniciamos el script de perl

my %Input;
my $query = new CGI;
my @pairs = $query->param;

foreach my $pair(@pairs){
        $Input{$pair} = $query->param($pair);
}

#Obtenemos el valor del Radio Button Actual
my $radioButton = $Input{'docTipo'}; #Segun el valor de un radio para escoger una carpeta
my $nombrePersonalizado = $Input{'cadenatexto'}; #Si cambian el nombre
my $nombre_en_servidor;
my $nuevoEstado = $Input{'newEstado'}; #Para saber que boton apreto
my $carpetaEstado = $Input{'MEstados'}; #Una <select> de html
my $Location;
my $whobutton = $Input{'btn_Accion'}; #un boton para saber que boton se apreto


#Directorio donde guardaremos archivos
my $dir = "/usr/local/psa/home/vhosts/pagina.com/httpdocs/Documentos/tmp"; #ruta del directorio donde se guardan los archivos
$Location = "http://miservidor.com/util/subearchivo.php"; #Redirecciono algunas variables para dar de alta en bases de datos y algunas cosas mas

#Verificamos que los botones no se aprieten
if ( $whobutton eq "Enviar"  ){ #Pregunto si el boton clickeado es el de valor enviado ( no sabia como se hacia y asi le hice XD)
       
        #Iniciar la recepcion del archivo
        recepcion_de_archivo();
#Parece que aqui da el problema ya que el location me termina mandando esto
#http://miservidor.com/util/subearchivo.php en el final. y nada concatenado <img src="http://perlenespanol.com/foro/images/smilies/icon_sad.gif" alt=":(" title="Sad" />
#Lo peor del caso es que aveces si me lo hace cuando espero algun tiempo y otras no :S
       
}elsif ( $whobutton eq "Agregar" ) {#Verificamos el boton apretado y mandamos variables. #Si se va agregar un estado
       
        $Location = "http://miservidor.com/util/eliminarEstados.php";#redirecciono pero aqui no me da problemas
        $Location = $Location . "?agrEstado=true&delEstado=false&objetivo=$nuevoEstado";
       
}elsif ($whobutton eq "Eliminar" ) { #Elimino pero no me da problemas
       
        $Location = "http://informanalitica.com/util/eliminarEstados.php";#redireccion pero igual no hay problema
        $Location = $Location . "?agrEstado=false&delEstado=true&objetivo=$carpetaEstado";
       
}


$nuevoEstado = "";
$carpetaEstado = "";

#Si el archivo se subio redireccionamos a la pagina de subir archivos con true.
#print "Content-type: text/html\n\n";
print "Location: $Location\n";#Redirecciono segun variable concatenada
exit(1);

#Finaliza script perl
#----------------------------------------------------------------------------------

#Funcion para recepcion de archivos
sub recepcion_de_archivo{  

$nombre_en_servidor = $Input{'userfile'};
$nombre_en_servidor =~ s/ /_/gi;
$nombre_en_servidor =~ s!^.*(\\|\/)!!;
my ($file, $ext ) = split( /\./ , $nombre_en_servidor );
#Si el input de nombre personalizado no esta vacio.
if ( $nombrePersonalizado ne "" ){
        $nombrePersonalizado = "$nombrePersonalizado.$ext";
        $nombrePersonalizado =~ s/ /_/gi;
        $nombrePersonalizado =~ s!^.*(\\|\/)!!;
        $nombre_en_servidor = "";
        $nombre_en_servidor = $nombrePersonalizado;
}

#La direccion que me deberia de mandar
$Location = $Location . "?nombreArchivo=$nombre_en_servidor&docTipo=$radioButton&estado=$carpetaEstado";

#Abrimos el nuevo archivo
        open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo $dir/$nombre_en_servidor<-";
        binmode(OUTFILE); #Para no tener problemas en Windows

#Transferimos byte por byte el archivo
        while (my $bytesread = read($Input{'userfile'}, my $buffer, 1024)) {
                print OUTFILE $buffer;
        }

#Cerramos el archivo creado
        close (OUTFILE);



} #sub recepcion_de_archivo
 


El problema como les comento es que me termina enviando una dirección del tipo:

Código:
http://miservidor.com/util/subearchivo.php

y no del tipo
Código:
http://miservidor.com/util/subearchivo.php?nombreArchivo=Hola&docTipo=Columnas&estado=Oaxaca


Esto es solo cuando le doy enviar. Espero que respondan mi duda :( Gracias por todo y espero respuesta :( ..... :?:


Última edición por ascot31 el 2008-03-14 20:26 @893, editado 1 vez en total

Nota 2008-03-14 05:39 @277
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10271
Bienvenido a los foros de Perl en Español, ascot31.

La modificación de la variable Location la puedes hacer también en el primer if, justo después de haber hecho la recepcion_de_archivo.

Yo no veo nada raro, excepto que en el código HTML, MEstados es un select sin valores, por lo que siempre debería estar vacío.

_________________
JF^D Perl programming


Nota 2008-03-14 13:15 @593

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
Mil gracias explorer por todo ^^. Pero bueno, sigamos con el problema :( pues a mi gusto también se me hacía que no hay nada malo (lo de MEstados sí se puede pasar vacío sin problemas) pero lo raro aun más comenzó cuando agregué algunos print para ver dónde pasaba la aplicación y ocurrió esto:

Codigo: Parte del If
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
if ( $whobutton eq "Enviar"  ){
       
        #Iniciar la recepcion del archivo
        recepcion_de_archivo();
        $Location = $Location . "?nombreArchivo=$nombre_en_servidor&docTipo=$radioButton&estado=$carpetaEstado";
        $debug1 = "pase debug 1 \n"; #VERIFICAMOS SI ENTRO EN EL IF
 


Codigo: (La SubRutina)
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
sub recepcion_de_archivo{ #Inicia la subrutina
  $debug2 = "Pase debug 2"; #VARIABLE PARA VERIFICAR QUE ENTRO A SUBRUTINA
 


A lo cual mando a imprimir los valores de lo que paso en texto htm y estos son los resultados de las variables debug.

Primer round:
Código:
http://lapagina.com/util/subearchivo.php?nombreArchivo=NicGer.txt&docTipo=Estados&estado=
Enviar
pase debug 1
Pase debug 2


Segundo round:
Código:
http://lapagina.com/util/subearchivo.php?nombreArchivo=&docTipo=Columnas&estado=
Enviar
pase debug 1


Como podrás ver en el segundo round no me está tomando el nombre del archivo. Es más, no está entrando a la subrutina, pero si al if para entrar a la subrutina; es más: mando a llamar al script y lo hace regularmente; la segunda vez ya no lo hace, pero si espero un rato como 30 segundos lo vuelve hacer... algo así como si necesitara sincronía o algo así con el server.

Esto ¿por qué se puede dar o qué opinan ustedes? :( mil gracias por todas las molestias :( y por la ayuda, espero su respuesta y otra vez mil gracias y chido el foro.


Nota 2008-03-14 13:37 @609
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Hola:

Me parece que el problema está en la siguiente línea:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
if ( $whobutton eq "Enviar"  ){


Debes de verificar que el nombre del botón siempre sea "Enviar", quizá por ahí tienes un JavaScript que le está cambiando el nombre.

Saludos

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2008-03-14 13:45 @615

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
kidd escribió:
Hola:

Me parece que el problema está en la siguiente línea:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
if ( $whobutton eq "Enviar"  ){


Debes de verificar que el nombre del botón siempre sea "Enviar", quizá por ahí tienes un JavaScript que le está cambiando el nombre.

Saludos

De hecho si está entrando al if por eso imprime "Pase debug 1"; lo que no sé es por qué no está entrando a la subrutina; aun así le echaré un vistazo pero si verificamos las salidas te diré que es cada uno.

Estos son los valores que imprime...
Cuando lo hace bien XD:
Código:
http://lapagina.com/util/subearchivo.php?nombreArchivo=NicGer.txt&docTipo=Estados&estado=
Valor del boton: Enviar
debug1 = pase debug 1
debug2 = Pase debug 2


Cuando lo hace mal XD:
Código:
http://lapagina.com/util/subearchivo.php?nombreArchivo=&docTipo=Columnas&estado=
Valor del boton: Enviar
Debug1  = pase debug 1
Debug2 = ""
El debug dos nunca fue llamado pero si entro al if, a donde no entro fue a la subrutina :S


entonces el valor del botón está bien pero no está entrando a la subrutina :S ya que la segunda salida que es la que esta mal tiene los mismos datos menos debug 2. Gracias ^^


Nota 2008-03-14 17:52 @786
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Realmente está extraño el comportamiento, pues viendo el código que muestras no hay razón aparente por la cual no debería de ejecutarse la función recepcion_de_archivo().

Lo único que puede estar pasando es que el script esté siendo terminado por algo exterior.

¿Las pruebas que haces son siempre con el mismo archivo?

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2008-03-14 18:59 @833
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10271
Coloca un

$|++;

al principio del fichero. Según has puesto las salidas del debug, debería salir primera la frase de la subrutina (la "Pase debug 2") y luego, la "Pase debug 1".

_________________
JF^D Perl programming


Nota 2008-03-14 19:17 @845

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
kidd escribió:
Realmente está extraño el comportamiento, pues viendo el código que muestras no hay razón aparente por la cual no debería de ejecutarse la función recepcion_de_archivo().

Lo único que puede estar pasando es que el script esté siendo terminado por algo exterior.

¿Las pruebas que haces son siempre con el mismo archivo?

Las pruebas las llevo haciendo con varios archivos, regularmente el primer intento sube bien, el segundo si lo hago luego me manda ese error de no entrar, pero sin embargo si me espero unos segundos como 40 segundos después, sí sube el segundo archivo... será alguna cuestión de memoria o algo así ??? o.O?


Nota 2008-03-14 19:18 @846

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
Ahora sí no te caché. ¿Dónde pongo eso...? u.u sorry


Nota 2008-03-14 19:24 @850
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10271
Después del

use CGI;

_________________
JF^D Perl programming


Nota 2008-03-14 20:06 @879

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
explorer escribió:
Coloca un

$|++;

al principio del fichero. Según has puesto las salidas del debug, debería salir primera la frase de la subrutina (la "Pase debug 2") y luego, la "Pase debug 1".

Pues si entendí bien. xD Siempre la salida es 1...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
use CGI;
$|++;  
 

¿Algo por parte del servidor que pueda afectar o.O?


Nota 2008-03-14 20:25 @892

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
Resuelto
No se la van a creer dije: "Si no está entrando al procedimiento pues lo forzamos". Entonces tomé el código que ya existía y nada más quité el procedimiento y puse todo el código y salió. Lo muestro a continuación para que vean los cambios con esto parece que está resuelto, quitar la subrutina y pegar el código. Raro pero funcionó.

Código
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
########################################################
#
# "Upload de archivos"
#
# Creado por: Uriel Lizama
# Todos los derechos reservado.
#
# <!-- m --><a class="postlink" href="http://perlenespanol.baboonsoftware.com/">http://perlenespanol.baboonsoftware.com/</a><!-- m -->
#
#########################################################

use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;

#iniciamos el script de perl

my %Input;
my $query = new CGI;
my @pairs = $query->param;

foreach my $pair(@pairs){
        $Input{$pair} = $query->param($pair);
}

#Obtenemos el valor del Radio Button Actual
my $radioButton = $Input{'docTipo'}; #Segun el valor de un radio para escoger una carpeta
my $nombrePersonalizado = $Input{'cadenatexto'}; #Si cambian el nombre
my $nombre_en_servidor;
my $nuevoEstado = $Input{'newEstado'}; #Para saber que boton apreto
my $carpetaEstado = $Input{'MEstados'}; #Una <select> de html
my $Location="";
my $whobutton = $Input{'btn_Accion'}; #un boton para saber que boton se apreto


#Directorio donde guardaremos archivos
my $dir = "/usr/local/psa/home/vhosts/informanalitica.com/httpdocs/Documentos/tmp";
$Location = "http://informanalitica.com/util/subearchivo.php";
 

#Array con extensiones de archivos que podemos recibir
#my @extensiones = ('pdf','gif','jpg','jpeg','bmp','png');

#Verificamos que los botones no se aprieten
if ( $whobutton eq "Enviar"  ){
       
        #Iniciar la recepcion del archivo      
        $nombre_en_servidor = $Input{'userfile'};
        $nombre_en_servidor =~ s/ /_/gi;
        $nombre_en_servidor =~ s!^.*(\\|\/)!!;
        my ($file, $ext ) = split( /\./ , $nombre_en_servidor );
       
        #Si el input de nombre personalizado no esta vacio.
        if ( $nombrePersonalizado ne "" ){
                $nombrePersonalizado = "$nombrePersonalizado.$ext";
                $nombrePersonalizado =~ s/ /_/gi;
                $nombrePersonalizado =~ s!^.*(\\|\/)!!;
                $nombre_en_servidor = "";
                $nombre_en_servidor = $nombrePersonalizado;
               
        }
       
        #Abrimos el nuevo archivo
                open (OUTFILE, ">$dir/$nombre_en_servidor") || die "No se puedo crear el archivo $dir/$nombre_en_servidor<-";
                binmode(OUTFILE); #Para no tener problemas en Windows
       
        #Transferimos byte por byte el archivo
                while (my $bytesread = read($Input{'userfile'}, my $buffer, 1024)) {
                        print OUTFILE $buffer;
                }
       
        #Cerramos el archivo creado
                close (OUTFILE);


        $Location = $Location . "?nombreArchivo=$nombre_en_servidor&docTipo=$radioButton&estado=$carpetaEstado";
       
       
}elsif ( $whobutton eq "Agregar" ) {#Verificamos el boton apretado y mandamos variables.
       
        $Location = "http://informanalitica.com/util/eliminarEstados.php";     
        $Location = $Location . "?agrEstado=true&delEstado=false&objetivo=$nuevoEstado";
       
}elsif ($whobutton eq "Eliminar" ) {
       
        $Location = "http://informanalitica.com/util/eliminarEstados.php";     
        $Location = $Location . "?agrEstado=false&delEstado=true&objetivo=$carpetaEstado";
       
}


        $nuevoEstado = "";
        $carpetaEstado = "";
       
        #Si el archivo se subio redireccionamos a la pagina de subir archivos con true.
        #$debug3 = $Input{'userfile'};
        #print "Content-type: text/html\n\n";
        print "Location: $Location\n";
        exit(1);

#Finaliza script perl
#----------------------------------------------------------------------------------
 


Realmente una jalada pero aquí dejo la solución por si alguien tiene el mismo problema gracias a los que me ayudaron un foro excelente y de rápida respuesta. Nos seguimos viendo xD por aquí :P


Nota 2008-03-14 21:30 @938
Avatar de Usuario
Creador de Perl en Español
Registrado: 2003-10-15 16:52 @744
Ubicación: México
Mensajes: 1163
Y me quedaré con la eterna duda de porque no corría correctamente con la llamada a la función :lol:

_________________
Uriel Lizama Perl programmer fundador de Perl en Español


Nota 2008-03-15 23:04 @003

Perlero Nuevo
Registrado: 2008-03-13 22:57 @998
Mensajes: 8
kidd escribió:
Y me quedaré con la eterna duda de porque no corría correctamente con la llamada a la función :lol:


¿Yo creo que cosas del demonio? :roll: :lol:


Responder al tema  [ 14 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO