Я довольно удивлен, обнаружив вышеупомянутую ошибку в своем журнале ошибок, потому что я думал, что уже сделал необходимую работу, чтобы поймать ошибку в моем PHP-скрипте:
if ($_FILES['image']['error'] == 0) { // go ahead to process the image file } else { // determine the error switch($_FILES['image']['error']) { case "1": $msg = "Uploaded file exceeds the upload_max_filesize directive in php.ini."; break; .... } }
В моем скрипте PHP.ini соответствующие настройки:
memory_limit = 128M post_max_size = 3M upload_max_filesize = 500K
Я понимаю, что 3M эквивалентно 3145728 байтам и что это то, что вызывает ошибку. Если размер файла превышает 500 тыс., Но меньше 3 М, скрипт PHP будет работать в обычном режиме, выдавая сообщение об ошибке в $msg
как в case 1
.
Как я могу уловить эту ошибку вместо того, чтобы позволить скрипту внезапно прекратиться с предупреждением PHP, когда размер сообщения превышает post_max_size
но все еще в пределах лимита памяти? Я посмотрел на подобные вопросы здесь , здесь и здесь , но не смог найти ответа.
Нашел альтернативное решение, которое напрямую не касается ошибки. Следующий код написан инженером-программистом Andrew Curioso в его блоге :
if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0) { $displayMaxSize = ini_get('post_max_size'); switch(substr($displayMaxSize,-1)) { case 'G': $displayMaxSize = $displayMaxSize * 1024; case 'M': $displayMaxSize = $displayMaxSize * 1024; case 'K': $displayMaxSize = $displayMaxSize * 1024; } $error = 'Posted data is too large. '. $_SERVER[CONTENT_LENGTH]. ' bytes exceeds the maximum size of '. $displayMaxSize.' bytes.'; }
Как объясняется в его статье, когда размер сообщения превышает post_max_size
, супер глобальные массивы $_POST
и $_FILES
станут пустыми. Таким образом, проверяя эти данные и подтверждая, что есть некоторый контент, отправляемый с использованием метода POST, можно предположить, что такая ошибка произошла.
На самом деле есть аналогичный вопрос, который мне раньше не удавалось найти.
Вы могли бы проверить его с помощью javascript прежде, чем загрузка даже состоится?
// Assumed input for file in your HTML <input type="file" id="myFile" /> //binds to onchange event of your input field $('#myFile').bind('change', function() { alert(this.files[0].size); });
Вы можете также попытаться поймать его:
try { if (!move_uploaded_file( 'blah blah' )) { throw new Exception('Too damn big.'); } // Can do your other error checking here... echo "Upload Complete!"; } catch (Exception $e) { die ('File did not upload: ' . $e->getMessage()); }