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. Если ограничение памяти включено с помощью конфигурации script, memory_limit также влияет на загрузку файлов. Вообще говоря, memory_limit должен быть больше, чем post_max_size. Когда используется целое число, значение измеряется в байтах. Также могут использоваться сокращенные обозначения, как описано в этом FAQ. Если размер пост-данных больше, чем post_max_size, суперглавы $_POST и $_FILES пустые. Это можно отслеживать различными способами, например. передавая переменную $_GET в script обработку данных, т.е., а затем проверяя, установлен ли $_GET ['обработан'].
Ответы
Ответ 1
Как отмечено в отредактированном вопросе $_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.
Ответ 2
Запустите 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
Ответ 3
Я могу упомянуть, что если вы обрабатываете форму, как показано ниже,
if(isset($_POST['submit'])
если post_max_size ниже опубликованных данных, тогда $_POST ['submit'] будет пустым
Ответ 4
Существуют некоторые ограничения - как на стороне клиента, так и на стороне сервера.
На стороне клиента поле MAX_FILE_SIZE не имеет большого значения, возможно, браузер может воспринимать его как подсказку; но браузеры следуют своим настроенным ограничениям.
На стороне сервера проверьте php.ini для:
upload_max_filesize = 5M
post_max_size = 5M
max_input_time = ...
Также проверьте журнал Apache для заметок о потерянном тесте POST или таком.
Ответ 5
Вы можете проверить ошибки при загрузке с помощью:
if ($_FILES['images']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['images']['error']);
}
Коды ошибок определены здесь.