Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
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.
