Syntax error How to upload large files above 500MB in PHP?

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