Загрузка файлов на сервер
PHP Manual

Наиболее распространенные ошибки

Опция MAX_FILE_SIZE не должна позволять передачу файлов, размер которых превышает лимит, установленный конфигурационной директивой upload_max_filesize в php.ini. Ограничение по умолчанию составляет 2 мегабайта.

В случае, если установлены ограничения памяти, вам может понадобиться увеличить значение опции memory_limit. Убедитесь в том, что значение memory_limit достаточно велико.

В случае, если опция max_execution_time установлена слишком маленьким значением, необходимое время работы скрипта может превышать это значение. Убедитесь в том, что значение max_execution_time достаточно велико.

Замечание: Директива max_execution_time касается исключительно времени, используемого непосредственно самим скриптом. Время, потраченное на внешние действия, такие как системные вызовы при помощи функции system() или sleep(), обращения к базе данных, а также время, потраченное на загрузку файла и другие действия, происходящие вне скрипта, не учитываются при определении максимально допустимого промежутка времени, отведенного для выполнения скрипта.

Внимание

Директива max_input_time указывает максимально допустимое время в секундах для получения входящих данных, в том числе и загружаемых файлов. В случае, если вы имеете дело с несколькими или большими файлами, либо удаленные пользователи используют медленный канал, ограничение по умолчанию в 60 секунд может быть превышено.

Если директива post_max_size слишком мала, большие файлы не смогут быть загружены на сервер. Убедитесь, что значение директивы post_max_size достаточно велико.

Начиная с версии PHP 5.2.12, опция max_file_uploads контролирует максимальное количество загружаемых файлов в течение одного запроса. Если загружается большее количество файлов, чем указано в этом ограничении, то массив $_FILES прекратит дальнейшую обработку файлов по достижении этого ограничения. Например, если max_file_uploads установлено в 10, то $_FILES никогда не будет содержать больше 10 элементов.

Если не проверять, с какими файлами вы работаете, пользователи могут получить доступ к конфиденциальной информации, расположенной в других директориях.

Следут заметить, что CERN httpd может отсечь все, что идет после первого пробела в получаемом от клиента заголовке content-type. Если у вас именно такой случай, CERN httpd не сможет корректно загрузить файлы.

Поскольку разные системы по-разному работают с файловой структурой, нет никаких гарантий того, что файлы с экзотическими именами (например, которые содержат пробельные символы) будут обработаны корректно.

Разработчики не должны использовать одинаковые имена для обычных полей ввода (тег input) и полей выбора файла в пределах одной и той же формы (например, используя имя для тега input наподобие foo[]).


Загрузка файлов на сервер
PHP Manual