Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect if uploaded file is too large

This is my upload form:

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

My max upload sizes are set like this:

; Maximum allowed size for uploaded files.
upload_max_filesize = 5M

; Must be greater than or equal to upload_max_filesize
post_max_size = 5M

If I upload a file that is larger then 5M var_dump($_FILES) is empty. I can do that:

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

$_FILES is not set if the file is larger then 5M. But this is a bit strange. How would you do that?

EDIT:

var_dump of file over 5M:

array(0) {
}

var_dump of file <= 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)
  }
}
like image 876
tuna Avatar asked Sep 02 '13 07:09

tuna


2 Answers

Like Rob mentioned, your post_max_size should be greater than your upload_max_filesize.

After that you can check $_FILES['fileupload']['error'] if it is UPLOAD_ERR_INI_SIZE the uploaded file is to large.

So in your php.ini set

; Maximum allowed size for uploaded files.
upload_max_filesize = 5M

; Must be greater than or equal to upload_max_filesize
post_max_size = 10M

In your uploads.php check

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
like image 64
Florian Grell Avatar answered Oct 23 '22 10:10

Florian Grell


You could check the $_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!');
}
like image 45
xdazz Avatar answered Oct 23 '22 08:10

xdazz