Подтвердить что ты не робот

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 ['обработан'].

4b9b3361

Ответ 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.

Ответ 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']);
}

Коды ошибок определены здесь.