2010-05-29 12 views
8

Estoy usando PHP para cargas de archivos. En el PHP manual muestra un ejemplo usando un campo oculto MAX_FILE_SIZE, diciendo que detectará en el lado del cliente (es decir, el navegador) si el archivo es demasiado grande o no.¿Detecta el tamaño de carga del archivo en el lado del cliente?

Acabo de probar el ejemplo en Firefox, Chrome e IE y no funciona. El archivo siempre se carga, incluso si es mucho más grande que el campo oculto especificado.

Dicho sea de paso, si el archivo es mayor que MAX_FILE_SIZE, entonces llamar al move_uploaded_file no funciona, por lo que parece que la variable está teniendo un efecto en el servidor, pero no en el lado del cliente.

Respuesta

10

En MAX_FILE_SIZE

leyeron:

... En http://pk.php.net/manual/en/features.file-upload.post-method.php y equivalentes ubicaciones en otros formatos, se hace constar que los navegadores toman el valor de un campo de formulario MAX_FILE_SIZE en cuenta.

Esta información se repite en otros lugares en la web y en los libros, pero parece que se origina a partir de la documentación de PHP (que no aparece en términos de otras tecnologías del lado del servidor).

No hay nada en cualquiera de los HTML, HTTP o especificaciones relacionadas para indicar que este es el caso (en particular, RFC 1867, que introdujo archivo subidas a HTML no lo menciona, por lo que no es incluso un caso de un kludge que se mencionó en el primer RFC y luego se descartó) ni tiene sentido en el contexto de las especificaciones de HTML (no hay nada que indique ninguna relación entre esa entrada oculta particular y la entrada de archivo) . Las únicas declaraciones sobre campos ocultos que pude encontrar en cualquiera de ellas fueron advertencias en las secciones de consideraciones de seguridad contra agentes de usuario basando cualquier operación relacionada con archivos en cualquier cosa mencionada en un campo oculto.

Ningún navegador parece realizar esto como una "extensión". De hecho, dado que existen potencialmente otros posibles significados para un campo oculto con ese nombre en una aplicación que maneja varias cargas de archivos, tendría para considerarse un defecto de diseño cualquiera.

Presento que no existe tal mecanismo en los navegadores mainstream (si hay alguno) en absoluto) y de hecho no debería serlo. La referencia al mismo debe eliminarse de la documentación .

Además, sugiero que, dado que esta idea se ha propagado a partir de esta documentación en otro lugar que una nota al respecto no funciona debe ser añadido.

Si se necesita o desea para manejar con mayor rapidez esta tipo de problema de manejo de archivo de un mecanismo de entonces se requiere funcionalidad para permitir PHP para interceptar las corrientes que se cargan antes de completar la solicitud, que sería completamente diferente a como sugiere esta documentación que debe tratarse, incluso si era cierto ...


el código de abajo vienen de swfUpload aplicación php:

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762) 
    $POST_MAX_SIZE = ini_get('post_max_size'); 
    $unit = strtoupper(substr($POST_MAX_SIZE, -1)); 
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1))); 

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) { 
     header("HTTP/1.1 500 Internal Server Error"); 
     echo "POST exceeded maximum allowed size."; 
     exit(0); 
    } 
// Validate the file size (Warning the largest files supported by this code is 2GB) 
    $max_file_size_in_bytes = 2147483647;   
    $file_size = @filesize($_FILES[$upload_name]["tmp_name"]); 
     if (!$file_size || $file_size > $max_file_size_in_bytes) { 
      HandleError("File exceeds the maximum allowed size"); 
      exit(0); 
     } 
+0

+1; buena investigación. – strager

+0

'necesita verificar que el archivo cargado sea inferior a MAX_FILE_SIZE con PHP' no, no es así. Deshacerse de este campo inútil –

+0

"requiere funcionalidad para permitir que PHP intercepte las secuencias que se cargan antes de completar la solicitud" -> PHP puede interceptar la solicitud si su longitud excede el límite especificado en 'post_max_size', pero requiere que el navegador envíe el encabezado de solicitud que contiene 'Content-Length', y de los navegadores modernos solo Opera parece estar enviando este encabezado. –

3

Por lo que yo sé no existe una solución simple, multi-navegador para lograrlo. Las únicas soluciones que funcionan son basadas en Flash o Java, ya que estas tecnologías pueden acceder al sistema de archivos y obtener información de archivos.

Scripts de ejemplo: YUI2 Uploader, FancyUpload, SWFUpload

+0

Además, hay Uploadify (http://www.uploadify.com/) para la carga de archivos HTML5 –

6

Probablemente esto sólo funciona en Firefox 3.6, por ahora:

<script type="text/javascript"> 
    function checkSize() 
    { 
     var input = document.getElementById("upload"); 

     // check for browser support (may need to be modified) 
     if(input.files && input.files.length == 1) 
     {   
      if (input.files[0].fileSize > 1024) /* or maybe .size */ 
      { 
       alert("The file must be less than 1KB"); 
       return false; 
      } 
     } 

     return true; 
    } 
</script> 


<form method="post" enctype="multipart/form-data" onsubmit="return checkSize()">  
    <input type="file" id="upload" /> 
    <input type="submit" /> 
</form> 

Ver http://www.w3.org/TR/FileAPI/.

1

Si está utilizando MAX_FILE_SIZE campo oculto correctamente, la carga del archivo se detendrá cuando el tamaño cargado alcance el valor especificado. Y ahorra a los usuarios la molestia de esperar a que se transfiera un archivo grande. Debe comprobar si la carga del archivo está detenida, en el lado del servidor, utilizando el error code generado.

if($_FILES['userfile']['error'] == 2) 
{ 
die("Maximum file size Exceeded"); 
} 
Cuestiones relacionadas