uploaded name files empty _files file-upload php

file upload - name - PHP $_POST/$_FILES vacío cuando sube más de POST_MAX_SIZE



upload file php mysql (2)

Algo como esto:

if ($_SERVER[''CONTENT_LENGTH''] && !$_FILES && !$_POST) { // upload failed }

No probado, así que juega con los diferentes escenarios para ver qué combinación funciona. No estoy seguro si funciona con varias cargas de archivos al mismo tiempo.

Es posible que deba inspeccionar $_SERVER[''CONTENT_LENGTH''] y compararlo con la suma de los archivos recibidos si se trata de múltiples cargas.

Posible duplicado:
¿Cómo detectar si un usuario subió un archivo más grande que post_max_size?

Estoy escribiendo un script que maneja cargas de archivos desde una aplicación web. Tengo un límite establecido para el tamaño de los archivos que pueden cargarse en mi aplicación (limitaciones de espacio de almacenamiento). Actualmente estoy tratando de poner un código de validación que verificará para asegurarse de que el usuario realmente cargó un archivo, para que pueda mostrarles un buen mensaje de error. Pero también me gustaría poder mostrar un mensaje de error al usuario si ha subido un archivo que es demasiado grande. Puedo usar Javascript para esto, pero me gustaría un chequeo PHP también en caso de que no tengan Javascript habilitado.

Establecí mi POST_MAX_SIZE var en PHP.ini para que sea el tamaño máximo de carga de archivos, pero esto ha producido un problema inesperado. Si alguien intenta subir un archivo más grande que POST_MAX_SIZE, los datos binarios simplemente se truncan en el tamaño máximo, y la matriz $ _FILES no contiene una entrada para ese archivo. Este es el mismo comportamiento que ocurriría si el usuario no enviara ningún archivo.

Esto hace que sea difícil decir por qué la matriz $ _FILES no contiene un archivo, es decir, si alguna vez fue cargado, o si era demasiado grande para enviarlo por completo.

¿Hay alguna forma de distinguir entre estos dos casos? En otras palabras, ¿hay alguna manera de saber si los datos POST se enviaron para un archivo, pero se truncaron prematuramente antes de enviar el archivo completo?


Por extraño que parezca, este es un comportamiento intencional , ya que POST_MAX_SIZE es un failsafe de bajo nivel, y para protegerte y evitar ataques de DOS, no hay forma de que el servidor pueda hacer nada más que descartar todos los datos de POST cuando se da cuenta, a mitad del flujo, que está recibiendo más datos de los que puede manejar con seguridad. Puede aumentar este valor si sabe que necesita recibir más datos de este a la vez (pero asegúrese de que su servidor pueda manejar la mayor carga que esto le supondrá), pero le sugiero que investigue otras formas de manejar su caso de uso. pegar contra POST_MAX_SIZE me sugiere que podría haber soluciones más robustas que una HTTP POST masiva, como dividirla en múltiples llamadas AJAX, por ejemplo.

Separado de POST_MAX_SIZE hay UPLOAD_MAX_SIZE que es la configuración de php.ini para un límite de archivo único, que es de lo que supuse que hablabas inicialmente. Limita el tamaño de cualquier archivo cargado, y si un archivo excede este valor, establecerá $_FILES[''file''][''error''] en 1 . En términos generales, desea configurar su sitio de esta manera:

  • El <form> MAX_FILE_SIZE debe establecerse en el máximo que realmente desea aceptar para este formulario. Si bien cualquier usuario que intente explotar su sitio puede evitar esto, es bueno para los usuarios que realmente usan su sitio, ya que el navegador (en realidad, podría ) evitar que desperdicien el ancho de banda al intentar cargarlo. Esto siempre debe ser más pequeño que la configuración del lado del servidor.
  • UPLOAD_MAX_FILESIZE es el tamaño máximo que aceptará el servidor, descartando cualquier cosa más grande e informando el error a la matriz $_FILES . Esto debería ser más grande que el archivo más grande que realmente quiere aceptar en su sitio.
  • POST_MAX_SIZE es la cantidad máxima de datos que su servidor está dispuesto a aceptar en una sola solicitud POST. Esto debe ser más grande que UPLOAD_MAX_SIZE para que las cargas grandes tengan éxito, y debe ser mucho más grande para permitir la carga de más de un archivo a la vez. Podría sugerir un valor de UPLOAD_MAX_FILESIZE * 4.1: esto permitirá cuatro archivos grandes a la vez, junto con un poco de datos adicionales. YMMV, por supuesto, y debe asegurarse de que su servidor pueda manejar adecuadamente los valores que decida establecer.

A su pregunta específica de Cómo decir, la documentación de PHP en POST_MAX_SIZE I se vinculó a la configuración sugerida de una variable get en el formulario, es decir,

<form action="edit.php?processed=1">

Sin embargo, como dije antes, si se encuentra con este problema, es posible que desee explorar métodos de carga alternativos.