Laravel 3 - POST Content-Length Exception

Запуск Laravel 3.

Я пытаюсь загрузить файлы с помощью фреймворка Laravel. Если файл больше, чем параметр php для upload_max_filesize это исключение ниже.

Я пробовал это в моем контроллере и маршрутах безуспешно (if оператор выполняется - он устанавливает сеанс - но исключение все еще выдается, показывая страницу ошибки)

if ($_SERVER['CONTENT_LENGTH'] > 8380000) {
    //do stuff here because its too big
    // set a session and exit()
}

Как я могу предотвратить появление этого исключения, не увеличивая ограничения памяти php?

Ошибка:

Unhandled Exception

Message:

POST Content-Length of 9306598 bytes exceeds the limit of 8388608 bytes
Location:

Unknown on line 0

Как примечание, этот вопрос задавался по крайней мере дважды на форуме laravel, но не было дано хорошего ответа, кроме как "увеличить ограничения памяти php".

РЕДАКТИРОВАТЬ: проблема, кажется, в том, что Laravel загружает все _POST входы, прежде чем я смог даже проверить их в маршруте или контроллерах. Похоже, ошибка для меня.

2 ответа

Решение

Это похоже на максимальный размер сообщения PHP, который по умолчанию составляет 8 МБ во многих системах (около 8388608 байт). В Laravel вы ничего не можете сделать, чтобы обойти это, поскольку он обрабатывается / управляется / настраивается на уровне PHP. Прочтите статью Увеличение максимального размера сообщения, чтобы узнать, как это изменить.

PHP выдает это предупреждение, а Laravel считает его фатальной ошибкой. Это сделано в Error::shutdownлюбая сгенерированная ошибка PHP приведет к закрытию приложения из-за этой ошибки.

Решение, которое я нашел, состоит в том, чтобы отфильтровать, какие типы ошибок могут заканчиваться Error::shutdown,
Недостатком является:

  • Необходимо изменить файл laravel: laravel/laravel.php что не очень хорошая идея, если вы планируете обновить laravel новыми версиями (что вряд ли произойдет сейчас, когда выйдет версия 4.1).
  • Не удалось полностью проверить, если это подразумевает некоторый побочный эффект в поведении Laravel, не прерывая ошибки предупреждения.

Это изменение, которое я сделал в файле laravel/laravel.php строка 46:

register_shutdown_function(function()
{
    require_once path('sys').'error'.EXT;
    $error = error_get_last();

    if ( $error!==null )
    {
        if( $error['type']!=E_WARNING )
        {
            Error::shutdown();
        }
     }
});
Другие вопросы по тегам