PHP – пустой $ _POST и $ _FILES – при загрузке больших файлов

У меня есть следующая проблема: у меня есть HTML-форма, которая загружает файл с дополнительной информацией. Но он позволяет загружать файлы, размер которых меньше 10 МБ. Но когда пользователь пытается загрузить что-то большее, оба массива $ _POST и $ _FILES пусты (я ожидал, что $ _POST будет иметь некоторые значения, а $ _FILES будет иметь некоторые значения, но укажет, что есть ошибка загрузки).

Существует несколько вопросов (пустой $ _POST, $ _FILES), но я не нашел решения или объяснения.

Форма 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; 

Он отлично работает, если размер файла меньше 10 МБ (ограничение размера файла – 10 МБ), и я не хочу его увеличивать, я просто хочу зафиксировать ошибку в PHP.

Обновлено (объяснение / решение) с сайта PHP

С сайта PHP (я пропустил этот раздел): http://us.php.net/manual/en/ini.core.php#ini.post-max-size

Устанавливает максимальный размер разрешенных данных. Этот параметр также влияет на загрузку файлов. Чтобы загрузить большие файлы, это значение должно быть больше, чем upload_max_filesize. Если ограничение памяти включено скриптом configure, memory_limit также влияет на загрузку файлов. Вообще говоря, memory_limit должен быть больше, чем post_max_size. Когда используется целое число, значение измеряется в байтах. Также могут использоваться сокращенные обозначения, как описано в этом FAQ. Если размер пост-данных больше, чем post_max_size, суперглавы $ _POST и $ _FILES пустые. Это можно отслеживать различными способами, например, передавая переменную $ _GET скрипту, обрабатывающему данные, то есть, а затем проверяя, установлен ли $ _GET ['обработан'].

Как отмечено в отредактированном вопросе $ _POST и $ _FILES пусты, когда PHP бесшумно удаляет данные (происходит, когда фактические данные больше, чем post_max_size). Поскольку HTTP-заголовок и $ _GET остаются неповрежденными, они могут использоваться для обнаружения сбросов.

Вариант a)

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

Вариант b)
Добавьте параметр GET, который сообщает, имеются ли данные POST.

Запустите phpinfo() и убедитесь, что ваши директивы upload_max_filesize и post_max_size достаточно велики.

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

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

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

если post_max_size ниже опубликованных данных, тогда $ _POST ['submit'] будет пустым

Существуют некоторые ограничения – как на стороне клиента, так и на стороне сервера.

На стороне клиента поле MAX_FILE_SIZE не очень полезно, возможно, браузер может воспринимать его как подсказку; но браузеры следуют своим настроенным ограничениям.

На стороне сервера проверьте php.ini для:

 upload_max_filesize = 5M post_max_size = 5M max_input_time = ... 

Также проверьте журнал Apache для заметок о потерянном тесте POST или таком.

Вы можете проверить ошибки при загрузке:

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

Здесь указаны коды ошибок.