Strange problem while uploading large files

11.1k Views Asked by At

I am having a strange problem while uploading large files in PHP.

In php.ini, max_execution_time is set to 30, post_max_size is set to 32M, upload_max_filesize is set to 32M. When I tried to upload a file of size 40.2 MB, it don't show any error. The $_FILES variable has the value array(0) { } and $_FILES['userfile'] shows NULL.

If the file size is more than the value set in php.ini, then it should return the error message

UPLOAD_ERR_INI_SIZE, Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini.

But it's not showing any error either (as $_FILES is an empty array). I am clueless why this is happening.

When I change in php.ini and set post_max_size is set to 64M, upload_max_filesize is set to 64M, then it works fine. So, I decided to use the following code, instead of changing php.ini file.

ini_set('upload_max_filesize', '64M');
ini_set('post_max_size', '64M');
ini_set('max_execution_time', 300);

I even tried to increase max_execution_time. Still, I am having the same problem. ini_set() is not working here.

4

There are 4 best solutions below

3
On BEST ANSWER

To have the 40 MB file fail with upload error, you have to increase the post_max_size, if you exceed the value of that variable, you get an empty $_FILES array. See the manual

If the size of post data is greater than post_max_size, the $_POST and $_FILES superglobals are empty.

Also, ini_set() is not working there because two of the variables you are trying to change are PHP_INI_PERDIR and thus need to be changed in php.ini or in .htaccess or httpd.conf. You should try the 40MB file with, for example, these settings in .htaccess

php_value upload_max_filesize 32M
php_value post_max_size 64M
php_value max_execution_time 300
1
On

There is one more setting you may need to look at, Apache's LimitRequestBody.

If the file exceeds that, the upload may get blocked before it even reaches PHP.

Apache Documentation

2
On

ini_set() is not working here.

The values you are trying to change with ini_set(), except for max_execution_time, cannot be changed with ini_set().
In the list of php.ini directives, they are reported to be of type PHP_INI_PERDIR, which means (as explained in Where a configuration setting may be set) that they can changed in php.ini, .htaccess or httpd.conf. Configuration settings that can be changed with ini_set() are the ones marked as PHP_INI_USER.

0
On

FOR SERVER:

In cPanel search for php, You will find "Select PHP version" under Software. Software -> Select PHP Version -> Switch to Php Options -> Change Value -> save.

FOR LOCAL:

Find the PHP ini(configuration settings) file in php folder under xampp. Change post_max_size = 40M and upload_max_filesize = 40M