Manejando la carga de archivos
PHP Manual

Dificultades comunes

El item MAX_FILE_SIZE no puede especificar un tamaño de archivo mayor que el que ha sido configurado en el upload_max_filesize en el archivo php.ini. Por defecto es 2 megabytes.

Si hay un límite de memoria activado, un memory_limit más grande puede ser necesario. Asegurarse de configurar un memory_limit lo suficientemente grande.

Si el max_execution_time es demasiado pequeño, la ejecución del script puede excederse de este valor. Asegurarse de configurar un max_execution_time lo suficientemente grande.

Nota: max_execution_time sólo afecta al plazo de ejecución del propio script. Todo el tiempo gastado en actividades que tengan lugar por fuera de la ejecución del script, tales como las llamadas al sistema usando system(), la función sleep(), las consultas a base de datos, el tiempo que tarda el proceso de subida de archivos, etc., no se incluye cuando se determina el tiempo máximo que el script ha estado funcionando.

Advertencia

max_input_time establece el tiempo máximo, en segundos, al script se le permite recibir información, esto incluye la subida de archivos. Para archivos grandes o múltiples, o usuarios con conexiones más lentas, el valor predeterminado de 60 segundos puede ser excedido.

Si post_max_size se establece demasiado pequeño, los archivos grandes no pueden ser cargados. Asegurarse de configurar post_max_size lo suficientemente grande.

A partir de PHP 5.2.12, la configuración max_file_uploads controla el número máximo de archivos que se pueden cargar en una petición. Si más archivos que ese límite son subidos, entonces $_FILES parará de procesar archivos una vez se alcanza el límite. Por ejemplo, si max_file_uploads se establece en 10, entonces $_FILES nunca contendrá más de 10 elementos.

No validar sobre cual archivo se opera puede significar que los usuarios pueden acceder a información sensible en otros directorios.

Por favor tener en cuenta que el CERN httpd parece quitar todo lo que empieza con primer espacio en blanco en la cabecera de tipo de contenido mime que recibe desde el cliente. Mientras este sea el caso, el CERN httpd no soportará la funcionalidad de carga de archivos.

Debido a la gran cantidad de estilos de lista de directorios, no podemos garantizar que los archivos con nombres exóticos (como el que contiene espacios en blanco) se manejen adecuadamente.

Un desarrollador no debe mezclar los campos input normales con los de carga de archivos en la misma variable de formulario (mediante un nombre de input como foo[]).


Manejando la carga de archivos
PHP Manual