2011-10-21 23 views
31

Tengo un problema siguiente, tengo un formulario HTML que carga un archivo con información adicional. Pero permite cargar archivos que solo tienen menos de 10 MB. Pero cuando el usuario intenta subir algo más grande, tanto $ _POST como $ _FILES están vacíos (esperaba que $ _POST tuviera algunos valores y $ _FILES tuviera algunos valores, pero indicaría que hay un error de carga).

Hay algunas preguntas (vacías $ _POST, $ _FILES) así, pero no encontré ninguna solución o explicación para ello.

formulario HTML:

<form enctype="multipart/form-data" method="post" action="upload.php"> 
    <p> 
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> 
     <input type="file" name="image" /> 
    </p> 
    <p> 
     <input type="text" name="other_field" /> 
    </p> 
</form> 

upload.php

print_r($_POST); // array() 
print_r($_FILES); // array() 
exit; 

Funciona bien, si el tamaño del archivo es de menos de 10MB (límite de tamaño del archivo es de 10 MB), y no quieren aumentar Es solo que quiero capturar un error en PHP.

Actualizado (explicación/solución) en el sitio de PHP

Desde el sitio PHP (me perdí esta sección): http://us.php.net/manual/en/ini.core.php#ini.post-max-size

Establece el tamaño máximo de datos de envío permitido. Esta configuración también afecta la carga de archivos. Para cargar archivos grandes, este valor debe ser mayor que upload_max_filesize. Si el script de configuración habilita el límite de memoria, memory_limit también afecta a la carga de archivos. En general, memory_limit debe ser mayor que post_max_size. Cuando se usa un número entero, el valor se mide en bytes. La notación abreviada, como se describe en esta pregunta frecuente, también se puede usar. Si el tamaño de los datos de publicación es mayor que post_max_size, los superglobals $ _POST y $ _FILES están vacíos. Esto se puede rastrear de varias maneras, p. pasando la variable $ _GET al script que procesa los datos, es decir, y luego verifica si $ _GET ['processed'] está configurado.

+1

¿Ha leído http://php.net/manual/en/features.file-upload.php? –

+2

sí, pero tal vez me perdí algo allí. Las matrices $ _FILES y $ _POST están vacías en este caso, y parece que deberían proporcionar un código de error. –

Respuesta

28

Como se señala en la pregunta editada $ _POST y $ _FILES están vacíos cuando PHP descarta datos en forma silenciosa (sucede cuando los datos reales son más grandes que pos_max_size). Como el encabezado HTTP y $ _GET permanecen intactos, se pueden usar para detectar los descartes.

Opción a)

if(intval($_SERVER['CONTENT_LENGTH'])>0 && count($_POST)===0){ 
    throw new Exception('PHP discarded POST data because of request exceeding post_max_size.'); 
} 

Opción b)
añadir un parámetro GET que indica si los datos de POST está presente.

+0

+1 para "excepción de tiro" – evilReiko

+1

Nota: $ _SERVER ['CONTENT_LENGTH'] no está configurado "siempre", el servidor del servidor puede desactivar esta variable para que no sea visible – evilReiko

+1

¡Gracias, esta es la respuesta! – brentonstrine

0

Existen algunos límites, tanto en el lado del cliente como del servidor.

En el lado del cliente, el campo MAX_FILE_SIZE no es de mucha utilidad, quizás el navegador lo pueda tomar como una pista; sino que los navegadores siguen sus límites configurados.

En el lado del servidor, compruebe php.ini para:

upload_max_filesize = 5M 

post_max_size = 5M 

max_input_time = ... 

también comprobar registro de Apache para las notas sobre el cuerpo de POST caído o tales.

+0

sí, sé que hay límites, pero ¿no debería dar un error cuando se alcanzan esos límites? –

+0

http://php.net/manual/en/features.file-upload.errors.php – Crontab

11

Ejecute phpinfo() y verifique que sus directivas upload_max_filesize y post_max_size sean lo suficientemente grandes.

http://us.php.net/manual/en/ini.core.php#ini.upload-max-filesize

http://us.php.net/manual/en/ini.core.php#ini.post-max-size

+1

Esto no soluciona la pregunta de por qué '$ _POST' está vacío. Si hubo un error con el tamaño del archivo, esperaría un mensaje de error, no un '$ _POST' vacío. – brentonstrine

+0

@brentonstrine ¿Estás ** ** ** necro'ando una publicación de octubre de 2011, hace casi tres años, para quejarse de una respuesta y un voto a la baja? El OP intentaba enviar archivos más grandes que su 'post_max_size'. Esto, a su vez (lea el OP), hace '$ _POST' y' $ _FILES' vacíos. – Crontab

+3

La intención no era quejarse, aunque veo cómo se manifiesta de esa manera. Su respuesta fue votado más alto que la respuesta de Augustus, que va mucho más allá de la suya para explicar realmente cuál es el problema e incluso proporciona una solución para detectar cuándo '$ _POST' está vacío porque excedió el máximo. Subí la suya y la voté a la baja para que su respuesta fuera la primera, ya que es más útil. El comentario fue solo una explicación para el voto a la baja. Sin embargo, estoy de acuerdo con la votación negativa: la información crítica es * por qué * '$ _POST' estaría vacía. – brentonstrine

-1

Puede comprobar si hay errores de carga con:

if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['images']['error']); 
} 

Los códigos de error se definen here.

+2

Dijo '$ _FILES' estaba vacío. No se puede verificar lo que no existe. – mpen

1

puedo mencionar que si procesa forma, como a continuación

if(isset($_POST['submit']) 

si post_max_size es inferior a los datos publicados entonces los $ _POST [ 'enviar'] estará vacía

Cuestiones relacionadas