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 and assembling these pieces when the upload is completed.

Method 1: Modifying PHP Settings

Updating php.ini File

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

upload_max_filesize = 500M
post_max_size = 500M
max_input_time = 300
max_execution_time = 300
memory_limit = 512M

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

Updating the .htaccess File

php_value upload_max_filesize 500M
php_value post_max_size 500M
php_value max_input_time 300
php_value max_execution_time 300
php_value memory_limit 512M

Changing Settings Inline

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

Method 2: Chunked Upload

In this process, a large file is split into smaller parts and then uploaded. This is the recommended approach for large files as it avoids server timeout issues −

Note: This example requires a web server environment with file system access and form uploads. Consider using libraries like Plupload or DropzoneJS for frontend implementation.

<?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");
?>

Comparison

Method Best For Server Impact Reliability
PHP Settings Small to medium files High memory usage May timeout
Chunked Upload Large files (500MB+) Low memory usage More reliable

Conclusion

For files above 500MB, chunked upload is the recommended approach as it prevents memory exhaustion and server timeouts. Modifying PHP settings should only be used for smaller files or when chunking is not feasible.

Updated on: 2026-03-15T08:35:32+05:30

12K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements