How to upload large files above 500MB in PHP?



Large files can be uploaded using PHP in two ways. Both of them are discussed below −

  • By changing the upload_max_filesize limit in the php.ini file.
  • By implementing file chunk upload, that splits the upload into smaller pieces an assembling these pieces when the upload is completed.

The php.ini file can be updated as shown below −

upload_max_filesize = 50M post_max_size = 50M max_input_time = 300 max_execution_time = 300

This should be avoided since it would change the settings of the server and other projects too.

Updating the htacess file

php_value upload_max_filesize 50M php_value post_max_size 50M php_value max_input_time 300 php_value max_execution_time 300

Changing the inline setting −

<?php    // changing the upload limits    ini_set('upload_max_filesize', '50M');    ini_set('post_max_size', '50M');    ini_set('max_input_time', 300);    ini_set('max_execution_time', 300);    // destination folder is set    $source = $_FILES["file-upload"]["tmp_name"];    $destination = $_FILES["file-upload"]["name"];    // uploaded folder is moved to the destination    move_uploaded_file($source, $destination); ?>

Chunking

In this process, a large file is split into smaller parts and then uploaded. The ‘Plupload’ library can be downloaded and used.

<?php    // the response function    function verbose($ok=1,$info=""){       // failure to upload throws 400 error       if ($ok==0) { http_response_code(400); }       die(json_encode(["ok"=>$ok, "info"=>$info]));    }    // invalid upload    if (empty($_FILES) || $_FILES['file']['error']) {       verbose(0, "Failed to move uploaded file.");    }    // upload destination    $filePath = __DIR__ . DIRECTORY_SEPARATOR . "uploads";    if (!file_exists($filePath)) {       if (!mkdir($filePath, 0777, true)) {          verbose(0, "Failed to create $filePath");       }    }    $fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : $_FILES["file"]["name"];    $filePath = $filePath . DIRECTORY_SEPARATOR . $fileName;    // dealing with the chunks    $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;    $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;    $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");    if ($out) {       $in = @fopen($_FILES['file']['tmp_name'], "rb");       if ($in) {          while ($buff = fread($in, 4096)) { fwrite($out, $buff); }       } else {          verbose(0, "Failed to open input stream");       }       @fclose($in);       @fclose($out);       @unlink($_FILES['file']['tmp_name']);    } else {       verbose(0, "Failed to open output stream");    }    // check if file was uploaded    if (!$chunks || $chunk == $chunks - 1) {       rename("{$filePath}.part", $filePath);    }    verbose(1, "Upload OK"); ?>

When a file whose size is greater than 500 MB is tried to be uploaded, it successfully gets uploaded.

Updated on: 2020-04-06T09:01:55+05:30

12K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements