• Publicidad

Restricción en tamaño de archivo en el upload

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

Restricción en tamaño de archivo en el upload

Notapor RetroFOX » 2008-08-25 12:35 @566

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.
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Publicidad

Notapor explorer » 2008-08-25 13:07 @588

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 & 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

Notapor RetroFOX » 2008-08-25 13:41 @612

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.
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Notapor RetroFOX » 2008-08-25 13:43 @613

Este es el código. Voy a ponerme a analizar. :-(

Sintáxis: [ Descargar ] [ Ocultar ]
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>";
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

:cry:
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Notapor RetroFOX » 2008-08-25 14:21 @640

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.
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Notapor explorer » 2008-08-25 14:24 @642

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use CGI;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

añade la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$CGI::POST_MAX = 10_000_000;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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 & 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

Notapor explorer » 2008-08-25 14:27 @644

De por sí... yo quitaría la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "000 - CGI funciona en este servidor";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El mensaje de proxy server debe haber quedado reflejado en los ficheros de log.
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

Notapor RetroFOX » 2008-08-25 14:31 @647

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.
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Notapor RetroFOX » 2008-08-25 14:44 @656

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.
RetroFOX
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2008-08-25 12:22 @557

Notapor explorer » 2008-08-25 14:47 @657

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 & 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

Siguiente

Volver a Web

¿Quién está conectado?

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