Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

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

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> CGI
Mensaje Lun Ago 25, 2008 11:35 am
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Restricción en tamaño de archivo en el upload Responder citando

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.
Mensaje Lun Ago 25, 2008 12:07 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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'.
Mensaje Lun Ago 25, 2008 12:41 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

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.
Mensaje Lun Ago 25, 2008 12:43 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

Este es el código. Voy a ponerme a analizar. Sad

Perl:
#!/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>";

Crying or Very sad
Mensaje Lun Ago 25, 2008 1:21 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

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:
.
Sigo analizando.
Mensaje Lun Ago 25, 2008 1:24 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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
Perl:
use CGI;

añade la línea
Perl:
$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.
Mensaje Lun Ago 25, 2008 1:27 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

De por sí... yo quitaría la línea
Perl:
print "000 - CGI funciona en este servidor";


El mensaje de proxy server debe haber quedado reflejado en los ficheros de log.
Mensaje Lun Ago 25, 2008 1:31 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

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.
Mensaje Lun Ago 25, 2008 1:44 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

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.
Mensaje Lun Ago 25, 2008 1:47 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Lun Ago 25, 2008 1:53 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

Claro, pero ¿cómo puedo editar el .htaccess (o lo que sea) para poder modificar este tiempo?
Mensaje Lun Ago 25, 2008 2:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Lun Ago 25, 2008 2:42 pm
RetroFOX
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Ago 2008
Mensajes: 8
Responder citando

Si, pero no sé... eso sirve solo para PHP creo. Fíjate que antes te había escrito algo al respecto.
Mensaje Lun Ago 25, 2008 4:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> CGI Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group