Обнаружить, если загруженный файл слишком большой

Это моя форма загрузки:

<form action="uploads.php" method="post" enctype="multipart/form-data"> <input name="fileupload" type="file" multiple> <button>Upload</button> </form> 

Мои максимальные размеры загрузки задаются следующим образом:

 ; Maximum allowed size for uploaded files. upload_max_filesize = 5M ; Must be greater than or equal to upload_max_filesize post_max_size = 5M 

Если я загружу файл, который больше, чем 5M var_dump($_FILES) пуст. Я могу это сделать:

 if($_FILES){ echo "Upload done!"; } 

$_FILES не устанавливается, если файл больше 5M. Но это немного странно. Как бы Вы это сделали?

РЕДАКТИРОВАТЬ:

var_dump файла через 5M:

 array(0) { } 

var_dump файла <= 5M:

 array(1) { ["fileupload"]=> array(5) { ["name"]=> string(13) "netzerk12.pdf" ["type"]=> string(15) "application/pdf" ["tmp_name"]=> string(22) "/tmp/uploads/phpWhm8M0" ["error"]=> int(0) ["size"]=> int(352361) } } 

Вы можете проверить $_SERVER['CONTENT_LENGTH'] :

 // check that post_max_size has not been reached // convert_to_bytes is the function turn `5M` to bytes because $_SERVER['CONTENT_LENGTH'] is in bytes. if (isset($_SERVER['CONTENT_LENGTH']) && (int) $_SERVER['CONTENT_LENGTH'] > convert_to_bytes(ini_get('post_max_size'))) { // ... with your logic throw new Exception('File too large!'); } 

Как и упоминалось выше, ваш post_max_size должен быть больше вашего upload_max_filesize .

После этого вы можете проверить $_FILES['fileupload']['error'] если UPLOAD_ERR_INI_SIZE загруженный файл будет большим.

Итак, в вашем наборе php.ini

 ; Maximum allowed size for uploaded files. upload_max_filesize = 5M ; Must be greater than or equal to upload_max_filesize post_max_size = 10M 

В вашей проверке uploads.php

 if($_FILES['fileupload']['error'] === UPLOAD_ERR_INI_SIZE) { // Handle the error echo 'Your file is too large.'; die(); } // check for the other possible errors // http://php.net/manual/features.file-upload.errors.php 

У меня была та же проблема, где $_FILES был бы пуст, если загруженный файл слишком велик. Основываясь на решениях xdazz и Florian , я пришел к выводу, что:

  • Если размер файла больше, чем post_max_size , то $_FILES пуст и $_FILES['fileupload']['error'] поэтому не определен: используйте решение xdazz. Однако вы получаете предупреждение от PHP ( Warning: POST Content-Length of xxx bytes exceeds the limit of yyy bytes in Unknown on line 0 ).
  • Если размер файла находится между post_max_size и upload_max_filesize , в этом случае вы можете использовать $_FILES['fileupload']['error'] , не беспокоясь о предупреждениях PHP.

Вкратце используйте следующий код:

  if (isset($_SERVER['CONTENT_LENGTH']) && (int) $_SERVER['CONTENT_LENGTH'] > (1024*1024*(int) ini_get('post_max_size'))) { // Code to be executed if the uploaded file has size > post_max_size // Will issue a PHP warning message } if ($_FILES[$this->name]['error'] === UPLOAD_ERR_INI_SIZE) { // Code to be executed if the uploaded file has size between upload_max_filesize and post_max_size // Will not issue any PHP warning message } 

Вы должны установить максимальный разрешенный размер файла более 5 миллионов, а затем PHP проверить, превышает ли размер файла 5M. Убедитесь, что размер тела вашего почтового сервера обновлен и с новым размером.

Ограничение размера файла на основе php ini – не лучшее решение, поскольку оно ограничит вас. Что делать, если вы хотите проверить другой файл, не превышающий 3 МБ в другом скрипте?

  if ($_FILES['fileupload']['size'] > 5242880) // 5242880 = 5MB echo 'your file is too large';