Foros del Web » Programando para Internet » PHP »

Limitar tamaño archivos subidos ANTES de que se suban

Estas en el tema de Limitar tamaño archivos subidos ANTES de que se suban en el foro de PHP en Foros del Web. No sé si es un tema que lo solucione php o es más bien de configuración del servidor... movedlo a donde mejor encaje El caso ...
  #1 (permalink)  
Antiguo 30/11/2006, 13:31
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Limitar tamaño archivos subidos ANTES de que se suban

No sé si es un tema que lo solucione php o es más bien de configuración del servidor... movedlo a donde mejor encaje

El caso es que tengo una página donde los usuarios pueden subir archivos. El temaño está limitado por el código a 150 KB, y por post_max_size a 8 MB. Hace unos días me encuentro un warning en el log de apache:

PHP Warning: POST Content-Length of 292872088 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

Es decir alguien intentó subir un archivo de casi 300 MB Obviamente dio error. El problema está en que los casi 300 MB se transfieren totalmente hasta el servidor antes de que dé el error, y mi pregunta sería si es posible que el error se genere al llegar a los 150 KB subidos o al menos a los 8 MB que es el máximo permitido en Apache, para no tener que esperar a que se suba todo el archivo (imaginad que va alguien y se pone a subir algo de 10 GB )

Un saludo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #2 (permalink)  
Antiguo 30/11/2006, 13:38
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
Pues lo que ya haria seria lo siguiente:

Código PHP:
$tamaño $_FILES["archivo"]["size"];

if(
$tamaño  >=30000)
  die(
"Error!!! No se permite este tamaño")
else
{
  
//codigo 

Saludillos.
  #3 (permalink)  
Antiguo 30/11/2006, 13:42
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Gracias mauled, pero eso es lo que tengo ya puesto, y doy fe de que funciona. El problema está en que eso sólo funciona una vez termina de subir el archivo, y lo que yo quiero es hacer eso mismo pero durante la subida del archivo, o algo parecido. La idea es poder cancelar la subida si se ve que ha superado el máximo permitido y no tener que esperar más

Saludos
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #4 (permalink)  
Antiguo 30/11/2006, 13:46
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
Si fueras tan amable de postear tú código te lo agradeceria muchisimo.

Saludillos.
  #5 (permalink)  
Antiguo 30/11/2006, 14:17
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Código PHP:
<?php
// Sacamos la extensión
$extension explode(".",$_FILES['archivo']['name']);
$num count($extension)-1;
// Comprobamos que valga
if (in_array(strtolower($extension[$num]),$validas)){
    if (!
$_FILES['archivo']['size']) {
        echo 
'<p align="center"><font color="#FF0000"><b>El archivo marcado no existe.</b></font></p>';
    } elseif (
$_FILES['archivo']['size'] < 1024 $max_size){
        
$temp_name microtime();
        if(
copy($_FILES['archivo']['tmp_name'], $path $temp_name)) {
            
// Si el upload va bien, insertamos el registro en la base de datos
            
query("INSERT INTO subs_lista (pelicula,extension,tipo,fps,cds,autor,comentario,descargas,estemes,time,ip) VALUES ('".trim($_POST['peli'])."' , '".$extension[$num]."' , ".$_POST['tipo']." , ".$_POST['fps']." , ".$_POST['cds']." , ".$user['id']." , '".$_POST['comentarios']."' , 0 , 0 , ".time()." , '".$_SERVER['REMOTE_ADDR']."')");
            
// Obtenemos el nombre final del fichero
            
$name str_pad(mysql_insert_id(),5,"0",STR_PAD_LEFT).".".$extension[$num];
            
// Renombramos
            
rename($path $temp_name$path $name);
            echo 
'<p align="center"><font color="#FF0000"><b>Archivo subido con éxito.</b></font></p>';
        }
    } else {
        echo 
'<p align="center"><font color="#FF0000"><b>El archivo supera los ' $max_size ' KB.</b></font></p>';
    }
} else {
    echo 
'<p align="center"><font color="#FF0000"><b>El formato no es válido, sólo archivos ZIP y RAR.</b></font></p>';
}
?>
Eso va dentro de un include en otro fichero... La variable $max_size vale 150 para limitar el tamaño a 150 KB. $path es la ruta absoluta del archivo (/home/usuario/public_html/carpeta/)
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #6 (permalink)  
Antiguo 30/11/2006, 14:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Hola ferny,

Si lo que quieres es obtener el "peso" (en bytes) de tu archivo, PHP no podrás usar para tal fin .. a lo sumo javascript, pero creo que por ahí tampoco puedes obtener esa información para hacer validaciones.

Pero .. en HTML según parece tienes una opción:

En tu formulario HTML añade esta constante:

Código PHP:
<input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 
Cita:
Example 38-1. File Upload Form
The MAX_FILE_SIZE hidden field (measured in bytes) must precede the file input field, and its value is the maximum filesize accepted. This is an advisory to the browser, PHP also checks it. Fooling this setting on the browser side is quite easy, so never rely on files with a greater size being blocked by this feature. The PHP settings for maximum-size, however, cannot be fooled. This form element should always be used as it saves users the trouble of waiting for a big file being transferred only to find that it was too big and the transfer failed.
Es decir .. esa constante usala para evitar dar el error de PHP de un upload sobrepasado vs a la configuración .. pero, igualmente valida en el lado del servidor como ya lo haces.

Si quieres alguna validación con más control .. deberías ver opciones tipo ActiveX o similar.

Un salduo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 30/11/2006, 15:43
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
El añadir ese campo hace que el script muestre "El archivo marcado no existe" cuando subes un fichero demasiado grande. Pero no me soluciona el problema pues el archivo sigue subiéndose enterito al servidor

Decir que tengo acceso root al servidor por si hay que cambiar algo

De momento me interesa saber si técnicamente es posible o hay que armar mucho follón, si no paso de hacerlo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #8 (permalink)  
Antiguo 30/11/2006, 20:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por ferny Ver Mensaje
El añadir ese campo hace que el script muestre "El archivo marcado no existe" cuando subes un fichero demasiado grande. Pero no me soluciona el problema pues el archivo sigue subiéndose enterito al servidor

Decir que tengo acceso root al servidor por si hay que cambiar algo

De momento me interesa saber si técnicamente es posible o hay que armar mucho follón, si no paso de hacerlo
Vía PHP no puedes hacer nada al respecto .. PHP sólo evalua lo que le llega (y cuando lo recibe completo) .. no vé los datos en modo "Raw" (puros) como por ejemplo hace Perl como para ir viendo lo que va subiendo, controlarlo y parar cuando supere tu tope impuesto.

Ya te comenté que deberías investigar por rutinas del lado del "cliente" .. ya sea javascript si puede, o algún ActiveX o similar siempre del "lado del cliente". Por lo menos así conseguiras "usabiliad" y .. como siempre la seguridad la tendrás en PHP al validar finalmente lo que subió.

Revisa este documento y los comentarios donde aparece el uso de cierto ActiveX:
http://www.jguru.com/faq/view.jsp?EID=330134

Por otro lado, como para imponer límites a los archivos que subes, en la configuración de tu servidor HTTP también puedes ajustar la cantidad de datos que por el pasan. En Apache me parece que es la directiva:
LimitRequestBody

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 01/12/2006, 06:23
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Activex lo descarto, buscaba una solución del lado del servidor... Pero no me voy a calentar mucho la cabeza, quería saber si habia una forma sencilla de hacerlo y parece que no, asi que lo dejo aparcado y no pasa nada...

LimitRequestBody no me valdría pq de vez en cuando necesito subir un archivo grande en otro <form> y ya no me lo tomaría El límite ya se lo meto vía código y funciona...

¡Un saludo y gracias por intentarlo!
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #10 (permalink)  
Antiguo 01/12/2006, 07:00
Avatar de Bellenger  
Fecha de Ingreso: noviembre-2004
Ubicación: En un lugar del Mundo...
Mensajes: 599
Antigüedad: 19 años, 5 meses
Puntos: 4
Proba con esto...

hola prueba con este codigo, a lo mejor te funciona...
este codigo es para determinar el tamaño del archivo en megas...
Código PHP:
    function fset_to_mbyte($Archivo){
        
$Size =  filesize($Archivo);
        
// funcion solo soporta 1 giba, finalizar para giga
        
$Largo strlen($Size);
        if (
$Largo >= && $Largo <= 3){
            
$Res['Tipo'] = 'byte';
            
$Res['Tamano']=$Size;
        } else if (
$Largo >= && $Largo <= 6){
            
$Res['Tipo'] = 'Kb';
            
$Res['Tamano'] = $Size 1024;
        } else if (
$Largo >= && $Largo <= 9){
            
$Res['Tipo'] = 'MB';
            
$Res['Tamano'] = ($Size 1024) / 1024;
        }
        
        
$Res['Tamano'] = substr($Res['Tamano'],0,6);
        
/*
        echo 'tamaño en bytes = '.$Size.'<br>';
        echo 'Largo es = '.$Largo.'<br>';
        echo 'Tipo es = '.$Res['Tipo'].'<br>';
        echo 'Resultado es = '.$Res['Tamano'].' '.$Res['Tipo'].'<br>';
        */
        
return $Res;
    } 
// este codigo es para subir el archivo al servidor... es otro :P
Código PHP:
    function fset_Cargar_Archivo($Archivo){    
        
$Directorio="uploads/"// cambiala por tu directorio
            
$Subir_Archivo=$Directorio.$_FILES['archivos']['name'];
            if (
is_uploaded_file($_FILES['archivos']['tmp_name'])){
                if (!
move_uploaded_file($_FILES['archivos']['tmp_name'], $Subir_Archivo)){
                    return 
false;
                }
            } else {
                return 
false;
            }
            return 
true;
    } 
puedes juntar los dos, primero verifica con el set_to_mbyte, y si es acorde a tus requerimientos recien lo sube....
ojo el set_to_mbyte, devuelve un array, asi que para saber el tamaño del archivo deveras acceder --->$Res['Tamano']
plop, ojala te sirva.
  #11 (permalink)  
Antiguo 01/12/2006, 07:20
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Gracias Bellenger pero creo que no solucionaría el problema, el fichero se transferiría íntegramente al servidor. Cluster ya me avisó de que vía PHP está jodida la cosa

Venga, si no pasa nada, era sólo si se podía hacer de forma simple, no quiero complicarme

Un saludo
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #12 (permalink)  
Antiguo 01/12/2006, 11:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por ferny Ver Mensaje
Activex lo descarto, buscaba una solución del lado del servidor... Pero no me voy a calentar mucho la cabeza, quería saber si habia una forma sencilla de hacerlo y parece que no, asi que lo dejo aparcado y no pasa nada...

LimitRequestBody no me valdría pq de vez en cuando necesito subir un archivo grande en otro <form> y ya no me lo tomaría El límite ya se lo meto vía código y funciona...

¡Un saludo y gracias por intentarlo!
mm Si vas a usar LimitRequestBody .. recuerda que deberías usarlo bajo configuración de tus servidores "virtuales" o incluso bajo un .htaccess

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 14/12/2006, 05:22
 
Fecha de Ingreso: diciembre-2006
Mensajes: 1
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Limitar tamaño archivos subidos ANTES de que se suban

Creo que poniendo esto antes del codigo que vaya a recibir los datos funciona con limite en este caso de 10 MB:
<%
if Request.ServerVariables("CONTENT_LENGTH")>10240000 then
mensaje=Server.UrlEncode("Tamaño de fichero excesivo")
end if
%>

Saludos
  #14 (permalink)  
Antiguo 14/12/2006, 09:11
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 2 meses
Puntos: 55
Re: Limitar tamaño archivos subidos ANTES de que se suban

Pero eso no es php ???
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #15 (permalink)  
Antiguo 14/12/2006, 10:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Limitar tamaño archivos subidos ANTES de que se suban

No es php, efectivamente. La 'traducción' sería (creo)

$cab = apache_request_headers();

if ($cab['Content-Lenght'] > 10240000) {
echo 'Tamaño de fichero excesivo";
}

Pero es otra solución que depende de php, por lo que tampoco funcionaría...


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:35.