If your file upload fail, you probably have to adjust the RequestReadTimeout configuration parameter of your apache web server.

Today, I switched the "server scripts/data" (another side project) from  my local apache server (XAMPP) to my VPS. It's an Android app with mostly server side data. It is also possible to upload images to the  server. The PHP-Script handles the upload process. One problem was the  error: UPLOAD_ERR_PARTIAL

How to solve it?

This error is in the documentation described as "Value: 3; The uploaded file was only partially uploaded.". But I couldn't find the reason with this description. Let's have a look in the error_log of the apache httpd.

[...] AH01382: Request body read timeout

After another research I found out, that the RequestReadTimeout was too low for my upload. To modify the timeouts, we have to edit the mod_reqtimeout module.

First, check if the module is installed and activated:

apachectl -M

This list should contain something like "reqtimeout_module (shared)".

As explained here,  I have multiple virtual hosts configured. Because of that, I don't want  to set the new values for all hosts, so I couldn't edit  /etc/httpd/conf/httpd.conf. Since I have created single configuration  files, I had the advantage that the changes will only take effect on  this host.

nano /etc/httpd/sites-available/[XYZ].conf

Replace [XYZ] with your configuration file.

We can now easily set the RequestReadTimeout to unlimited (or another value) for the header and the body by adding:

...
RequestReadTimeout header=0 
RequestReadTimeout body=0 
...

Just restart the httpd daemon and you are ready to go

apachectl restart

This solved my problem.

It is  probably not a good idea to set no limits for these timeouts. I'm now  trying to find the best value. What is your best practice?


Please comment below, if you have any questions.

Tested on:

  • OS: CentOS 7
  • Apache: 2.4.6
  • PHP: 7.1.7

Credits: