Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Restricción en tamaño de archivo en el upload Responder al tema
Nuevo tema


Página 1 de 1  [ 14 mensajes ] 
 
Nota 2008-08-25 12:35 @566

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Restricción en tamaño de archivo en el upload
Hola, tengo un upload con AJAX y cgi; la verdad es que no sé mucho de esto... lo mío es PHP, y no entiendo del todo bien cómo funciona.

Este es el script funcionando:
http://yomiento.webfactional.com/lightloader/upload_tester.php

Mi problema es que no puedo subir archivos mayores a 1.4Mb... ¿cómo puedo solucionar esto?.

Con PHP defino los valores max_file_upload y otros relacionados; ¿tengo que hacer algo similar con este script?

Saludos y gracias.


Nota 2008-08-25 13:07 @588
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Bienvenido a los foros de Perl en Español, RetroFOX.

No nos has enseñado el script upload.cgi, que es el que hace la subida de los datos.

En estos foros encontrarás algunos hilos de este tema. Usa el sistema de búsqueda. Busca por la palabra 'POST_MAX'.

_________________
JF^D Perl programming


Nota 2008-08-25 13:41 @612

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Hola, explorer... ¿necesitas el código fuente del script?.

He buscado también y leído los tutoriales que han realizado, pero en ningún caso se habla (o no lo he visto) de un requerimiento para configurar un tamaño máximo de upload o algo similar.

Ahora busco el script.


Nota 2008-08-25 13:43 @613

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Este es el código. Voy a ponerme a analizar. :-(

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "000 - CGI funciona en este servidor";


$max_upload = 100000000; # Set this to whatever you feel suitable for you.
$tmp_dir="tempfiles";   # If you change this you need to change it in filestatus.php too.
                        # Also, on *nix systems you may have to set the folder permissions
                        # to 777 in order to get this script to work properly.  
#############
# /SETTINGS #
#############
use CGI;
use Fcntl qw(:DEFAULT :flock);
use File::Temp qw/ tempfile tempdir /;
#use Carp;


@qstring=split(/&/,$ENV{'QUERY_STRING'});
@p1 = split(/=/,$qstring[0]);
$sessionid = $p1[1];
$sessionid =~ s/[^a-zA-Z0-9]//g;  # sanitized as suggested by Terrence Johnson.

# don't change the next few lines unless you have a very good reason to.

$post_data_file = "$tmp_dir/$sessionid"."_postdata";
$monitor_file = "$tmp_dir/$sessionid"."_flength";
$error_file = "$tmp_dir/$sessionid"."_err";
$signal_file = "$tmp_dir/$sessionid"."_signal";
$qstring_file = "$tmp_dir/$sessionid"."_qstring";

#require("./header.cgi");

#carp "$post_data_file and $monitor_file";

$content_type = $ENV{'CONTENT_TYPE'};
$len = $ENV{'CONTENT_LENGTH'};
$bRead=0;
$|=1;


sub bye_bye {
        $mes = shift;
       
        # Try to open error file to output message too
        $err_ok = open (ERRFILE,">", $error_file);
        if($err_ok) {
                print ERRFILE $mes; #write message to file, so can be read from fileprogress.php
                close (ERRFILE);
        }
        exit;
}

# see if we are within the allowed limit.

if($len > $max_upload)
{
        close (STDIN);
        bye_bye("The maximum upload size has been exceeded");
}


#
# The thing to watch out for is file locking. Only
# one thread may open a file for writing at any given time.
#

if (-e "$post_data_file") {
        unlink("$post_data_file");
}

if (-e "$monitor_file") {
        unlink("$monitor_file");
}

if (-e "$error_file") {
  unlink("$error_file");
}

sysopen(FH, $monitor_file, O_RDWR | O_CREAT)
        or &bye_bye ("cannot open numfile: $!");

# autoflush FH
$ofh = select(FH); $| = 1; select ($ofh);
flock(FH, LOCK_EX)
        or  &bye_bye ("Cannot write-lock numfile: $!");
seek(FH, 0, 0)
        or &bye_bye ("cannot rewind numfile : $!");
print FH $len; 
close(FH);     
       
sleep(1);


open(TMP,">","$post_data_file") or &bye_bye ("cannot open temp file");
binmode TMP, ':raw';

#
# read and store the raw post data on a temporary file so that we can
# pass it though to a CGI instance later on.
#



my $i=0;

$ofh = select(TMP); $| = 1; select ($ofh);
                       
while (read (STDIN ,$LINE, 4096) && $bRead < $len )
{
        $bRead += length $LINE;
       
        select(undef, undef, undef,0.35);       # sleep for 0.35 of a second.
       
        # Many thanx to Patrick Knoell who came up with the optimized value for
        # the duration of the sleep

        $i++;
        print TMP $LINE;
}

close (TMP);

#
# We don't want to decode the post data ourselves. That's like
# reinventing the wheel. If we handle the post data with the perl
# CGI module that means the PHP script does not get access to the
# files, but there is a way around this.
#
# We can ask the CGI module to save the files, then we can pass
# these filenames to the PHP script. In other words instead of
# giving the raw post data (which contains the 'bodies' of the
# files), we just send a list of file names.
#

open(STDIN,"$post_data_file") or &bye_bye("cannot open temp file");

my $cg = new CGI();
my $qstring="";
my %vars = $cg->Vars;
my $j=0;

while(($key,$value) = each %vars)
{
       
        $file_upload = $cg->param($key);

        if(defined $value && $value ne '')
        {      

                my $fh = $cg->upload($key);
                if(defined $fh)
                {
                        #carp $fh;
                        ($tmp_fh, $tmp_filename) = tempfile();

                        while(<$fh>) {
                                print $tmp_fh $_;
                        }

                        close($tmp_fh);

                        $fsize =(-s $fh);

                        $fh =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
                        $tmp_filename =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
                        $qstring .= "file[name][$j]=$fh&file[size][$j]=$fsize&";
                        $qstring .= "file[tmp_name][$j]=$tmp_filename&";
                        $j++;
                }
                else
                {
                        $value =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
                        $qstring .= "$key=$value&" ;
                }
        }
}


open (SIGNAL,">", $signal_file) or &bye_bye ("cannot open signal file");
print SIGNAL "\n";
close (SIGNAL);

open (QSTR,">", "$qstring_file") or &bye_bye ("cannot open output file");
print QSTR $qstring;
close (QSTR);

print "Content-type: text/html\r\n";
print "<html></html>";

:cry:


Nota 2008-08-25 14:21 @640

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Estuve haciendo unas pruebas ...
En todo Ajax File Upload donde sabemos que en realidad estamos haciendo una triquiñuela para engañar al visitante ocultando un iframe que es el encargado de subir el archivo al servidor mientras nosotros vamos decorando con una barra de progreso el estado de upload.
Lo que hice fue mostrar el iframe para ver el error que me da el server y me da este error:
Imagen.
Sigo analizando.


Nota 2008-08-25 14:24 @642
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Por lo que veo, el límite lo impone la variable $max_upload, pero veo que está limitado a 100M. Quizás el problema esté en otro sitio... Quizás sea una limitación del lado del servidor...

Para asegurarte, después de la línea
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
use CGI;

añade la línea
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$CGI::POST_MAX = 10_000_000;

o al límite que quieras. Por defecto, no está limitado, pero quién sabe si ha sido modificado en el servidor.

Revisa también los ficheros de log, por si aparece algún mensaje de error.

_________________
JF^D Perl programming


Nota 2008-08-25 14:27 @644
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
De por sí... yo quitaría la línea
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
print "000 - CGI funciona en este servidor";


El mensaje de proxy server debe haber quedado reflejado en los ficheros de log.

_________________
JF^D Perl programming


Nota 2008-08-25 14:31 @647

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Ok, gracias explorer...

Me dicen que en realidad es una limitación que tiene el servidor Apache al mantener un script por 2 minutos... luego de esto automáticamente se corta la ejecución.

Yo entiendo que esto es una seguridad para el servidor y en parte para mi aplicación... pero indefectiblemente para subir archivos grandes necesito más tiempo de ejecución, ¿ no ?.

Estoy viendo cómo hacer... dicen que puede aumentar ese tiempo a 3 minutos. En fin... gracias por los datos. The show must go on.


Nota 2008-08-25 14:44 @656

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Es eso ... el script se corte a los 2 minutos exactamente. La verdad que tampoco se muy bien como se configurae este valor de apache mediante el -htaccess.
Para php lo hice asi:
php_value upload_max_filesize 100M
php_value max_execution_time 36000
php_value max_input_time 36000

en fin ... seguimos.


Nota 2008-08-25 14:47 @657
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
El tiempo dependerá del tiempo de transferencia desde el ordenador del usuario al servidor. Coge la velocidad más baja (la de descarga del servidor o la de subida del usuario). Con la calculadora, divide el tamaño del fichero entre esa velocidad y obtendrás el tiempo 'teórico' que tardará en subir.

_________________
JF^D Perl programming


Nota 2008-08-25 14:53 @662

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Claro, pero ¿cómo puedo editar el .htaccess (o lo que sea) para poder modificar este tiempo?


Nota 2008-08-25 15:18 @679
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Ese es un parámetro que en Apache creo que no está. Puede ser el ulimit del sistema operativo, o quizás el max_execution_time del PHP, como comentan en este hilo.

_________________
JF^D Perl programming


Nota 2008-08-25 15:42 @696

Perlero Nuevo
Registrado: 2008-08-25 12:22 @557
Mensajes: 8
Si, pero no sé... eso sirve solo para PHP creo. Fíjate que antes te había escrito algo al respecto.


Nota 2008-08-25 17:30 @771
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Serán los dueños del servidor los que te pueden decir mejor dónde está ese límite y si lo puedes cambiar tu. Explícales tu problema.

_________________
JF^D Perl programming


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