Это моя форма загрузки:
<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';