В настоящее время, когда пользователь загружает фотографию, на странице написано «Предупреждение: POST Content-Length из XXX байтов превышает предел 21000000 байт в Unknown on line 0».
Я знаю, что это значит, и я не ищу таких решений, как увеличение значений max_upload или даже memory_size_limit … Поскольку пользователи могут и пользователи будут загружать терабайты бессмыслицы, даже если вы явно укажете им только файлы размером не более 20 МБ, и разрешены только изображения ,
Я ищу решение по:
РЕДАКТИРОВАТЬ: ПОЖАЛУЙСТА ПРОЧИТАЙТЕ – Пожалуйста, поймите, что, конечно, я обрабатываю ошибку / предупреждение после (начиная с строки 1), проблема в том, что это происходит на виртуальной «линии 0» , поэтому мне нужно скрыть ошибку или предотвратить ее повышение – потому что я не могу поставить любой код перед местом, где происходит ошибка.
EDIT2: Наконец, после очень продолжительных исследований и копания у меня появилась идея – она сработала – см. Мой собственный ответ.
Поэтому после поиска вместо того, чтобы работать сегодня, я наконец понял, как это решить, он работал и даже не наносил большого ущерба. Но сначала поймите, что вы делаете, прежде чем делать это. 🙂 Как я предложил в одном из моих комментариев, действительно можно отключить PHP-ошибки в .htacess – просто отключите предупреждения запуска PHP.
Обратите внимание: после того, как вы вставляете этот код в свой .htaccess, вы не сможете увидеть какую-либо ошибку при запуске
Также обратите внимание на то, что в строке «0» больше ошибок при запуске.
Делайте это раньше: прежде чем вы это сделаете, вы должны подготовить свой сценарий так, чтобы он проверял размер загруженного контента и предоставил пользователю правильное информационное сообщение . Тот факт, что предупреждение не показывает, НЕ означает, что вы ничего не должны с этим делать. Это означает, что EXACT oposite – вы должны сделать все возможное, чтобы сделать что-то хотя бы почти равным предупреждению рейза – проверьте, дважды проверьте, можете ли вы справиться с ошибкой и создать собственное сообщение об ошибке.
php_flag display_startup_errors off
Обратите внимание, что это отключает только ошибки запуска.
Таким образом, все регулярные PHP-ошибки / предупреждения / уведомления остаются включенными 🙂
Литература файла php.ini
говорит:
; display_startup_errors ; Default Value: Off ; Development Value: On ; Production Value: Off
PS: «Ошибка при запуске», по-видимому, является этими ошибками до того, как скрипт PHP выполняется сам – эти ошибки обычно пытаются «убедить» вас в том, что они находятся на линии 0 .
Благодаря моей идее и этому ответу: как отключить уведомление и предупреждение в PHP в файле .htaccess?
EDIT: поскольку это параметр php_flag, вы можете, конечно же, установить его по умолчанию в php.ini, если у вас есть настраиваемая установка PHP 🙂
Вопрос в том
Как предотвратить предупреждение: POST Content-Length
ответ заключается в том, что без изменения какого-либо значения конфигурации поместите этот код в самом начале файла, который получит форму, подлежащую обработке:
<?php // here start your php file ob_get_contents(); ob_end_clean();
То есть. Больше никаких предупреждений, кроме всего прочего вы не хотите, как вывод на своей странице. После того, как было предложено в другом месте, вы можете решить, что делать:
if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0){ echo"WoW your file is too big!"; }
Может быть, также вырезать файл, если по-другому вы передадите правильные значения файла, который будет обрабатываться Php.
как описано здесь. Предупреждение: POST Content-Lenght …
У меня есть аналогичная проблема для вас, и подумал, нашли ли вы удовлетворительное решение. В настоящее время мой «PHP Warning: POST Content-Length из 21010354 байт превышает предел 8388608» находится в журнале, и я не думаю, что я могу с этим справиться.
Я работаю в рамках Zend, и когда пользователь загружает файл, как описано выше, он в основном убивает все обычные синтаксические анализаторы POST, поэтому ответ на getParams () не содержит никаких обычных параметров POST. Это означает, что пользователи получают ошибку проверки, заявив, что одно из полей отсутствует, что вводит в заблуждение.
Изучая это, я нашел несколько интересных параметров php_ini, которые вы, возможно, захотите посмотреть, в частности enable_post_data_reading и always_populate_raw_post_data. В моем случае я загружаю 20-мегабайтный файл с 8M post max и 10M загруженным файлом max, и результат ввода php: // кажется полным в 20-мегабайтном файле, хотя почтовые данные теперь пустые ,
Поэтому я собираюсь вручную проверить, превышает ли исходные данные предел, и предположить, что все не удалось, если это произошло (и залог). Я предлагаю вам написать собственный код для анализа необработанных данных, чтобы заполнить данные $ _POST. Затем вы можете запустить свой код, как хотите, и только когда вы будете готовы, проверьте, загрузил ли пользователь больше данных, чем лимит. Это вам, чтобы затем вернуть ошибку перед ее разбором или, если все в порядке, разобрать ее. До тех пор, пока вы устанавливаете ограничения на отправку и выгрузку PHP, превышаете лимит пользователя, он должен позволить пользователю нарушать правила, позволяя вашему коду обнаруживать затвор и жаловаться на него.
Вот РЕАЛЬНОЕ решение, чтобы предотвратить эту ошибку.
Задайте эти параметры в php.ini:
enable_post_data_reading = On upload_max_size=0 post_max_size=0
Предупреждение: обязательно, чтобы эта строка была в вашей форме
<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />
И САМЫЙ ВАЖНЫЙ:
обязательно проверьте ошибки кода $ _FILES ['file'] ['error']
обязательно проверьте размер своей загрузки на PHP тоже
Как вы уже выяснили для себя, это невозможно сделать в PHP, поскольку PHP может только ловить ошибки из строки 1 и далее.
Единственным способом было бы выкопать исходный код PHP, найти, где эта ошибка будет выброшена, и удалить эту часть из источников PHP, прежде чем компилировать вашу версию PHP для костюмов.
Но будьте осторожны, что сообщение об ошибке вызывается по какой-то причине.
Чтобы предотвратить эту ошибку, вы должны проверить размер загруженных файлов до и в случае, если они будут большими, вам нужно отменить загрузку!
Чтобы просто не показывать их, я думаю, этого должно быть достаточно, если вы напишете в своем php-скрипте
error_reporting(0);
1.Вы можете проверить размер файла перед загрузкой на JavaScript, но это может быть подделано!
2.Проверьте размер файла после загрузки и перед сохранением файла.
<?php $size = filesize($uploaded_file); if($size > $your_size_limit) { echo "Throw bunch of errors"; } else { //save it } ?>
3. Не пытайтесь скрыть ошибки, чтобы решить проблему.