Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

4GB HTTP File Uploads Using jQuery-File-Upload, Apache and PHP

This problem seems directly related to the infamous 2GB limit and I'm not sure at this atge if its a 32bit PHP issue. I've seen the comments related to HTTP not being designed for such large files. However, I would rather exhaust this direction before deciding on any fundamental change to what has been proven to work so far. As the title suggest I need to upload >2GB files, largest so far 3.8GB. I have a form built using jQuery-file-upload which has had no problems sending any files (all less <2GB) until these large ones started. The 3.8GB one takes maybe 5 minutes to upload from File-Upload and the progress bar completes to 100%. However the reported error after upload is a type 1 which suggests the file size limit has been breached.

If I monitor the disk usage on the server during upload it will have the following sample properties: Before upload the disk is 30% used, as the upload continues this usage increases, 31%,32%....45%,46%etc. However at around the 2GB point the disk usage drops back to 30% while the client/browser File-Upload continues. When the servers disk usage stops increasing the client may only be at 60% of the upload. Yet the client still continues to 100% but isn't being accepted by the server as the disk status never moves off 30%.

I'm running 64Bit Ubuntu (latest) with Apache/2.2.22 (Ubuntu) and PHP Version 5.3.10-1ubuntu3.2 After many days on and off searching for a solution I still cannot get the 3.8GB file to upload after changing so many settings. I'll list the sort of changes below but at this stage I think it may be a 32bit PHP issue so if anyone can suggest a link worth following or solution worth trying I'd appreciate it.

In Apache2 I've set the following:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 4939212390
    - php_value upload_max_filesize 4831838208
    - php_value post_max_size 4939212390

In php.ini I've set the following:

- UPLOAD_MAX_FILESIZE 4831838208
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

If I run the following on the server it would seem the PHP does not have a 32bit issue but I'm not sure at this stage.

php -r "echo PHP_INT_MAX;"
9223372036854775807

As I mentioned any ideas would be greatly appreciated.

UPDATE:

Have solved this issue, so thanks to @BogdanBurim for suggesting the back to basics approach:

I have managed to upload a 3.8 GB file over HTTP with the following settings:

In Apache2 I've set the following:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

In php.ini I've set the following:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

The only other important part of this solution was having to remove the MAX_FILE_SIZE, HTML from the upload form:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

Having this set continually caused a PHP type 2 error, so php couldn't handle the greater than 32bit integer that is set. Removing it caused PHP type 1 errors until I changed the UPLOAD_MAX_FILESIZE to 0 everywhere and hey presto it now works!!!!

http://php.net/manual/en/features.file-upload.errors.php

like image 614
Diplonics Avatar asked Nov 26 '12 22:11

Diplonics


People also ask

How to create a file upload database in phpMyAdmin using jQuery?

Open phpMyAdmin and create a new database with the name that you want. The SQL query for creating the database is mentioned below. I used the database called jquery_fileupload_db. After establishing the database, select it and run the SQL commands below to rapidly construct a table with two fields id and filename.

What are HTML5 file uploads?

What are HTML5 File Uploads? Uploading files using HTML5 is actually a combination of three technologies - the new File Reader API, the also new Drag & Drop API, and the good ol' AJAX (with the addition of binary data transfer). Here is a description of a HTML5 file upload process:

How to upload a file to Ajax?

Check if the filename is valid (if the filename has a /, it will affect the destination path). Check that the file doesn’t already exist at the target location (based on the name). Finally, upload the file. Let’s create the PHP script to deal with the functionality of file uploading. Create ajaxupload.php and type the following code in it.

What is the best PHP file upload library?

A: Though there are several files uploading PHP libraries available in the market, the best one to use is the HTML5 File Upload library. It is very easy to use and the most popular library among the developers, as it simplifies file uploading and validation in a few quick steps. Q: Where can I download the PHP file upload script?


Video Answer


1 Answers

Have solved this issue, so thanks to @BogdanBurim for suggesting the back to basics approach:

I have managed to upload a 3.8 GB file over HTTP with the following settings:

In Apache2 I've set the following:

- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
    - LimitRequestBody to 0
    - php_value upload_max_filesize 0
    - php_value post_max_size 4939212390

In php.ini I've set the following:

- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M

The only other important part of this solution was having to remove the MAX_FILE_SIZE, HTML from the upload form:

<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />

Having this set continually caused a PHP type 2 error, so php couldn't handle the greater than 32bit integer that is set. Removing it caused PHP type 1 errors until I changed the UPLOAD_MAX_FILESIZE to 0 everywhere and hey presto it now works!!!!

http://php.net/manual/en/features.file-upload.errors.php

like image 187
Diplonics Avatar answered Oct 05 '22 04:10

Diplonics