Handling multiple uploads
PHP can handle multiple file uploads. Since HTML5, the <input>
element with type="file"
allows you to select one or more files. To do so follow these steps:
<input type="file" name="upload[]" multiple>
- Add
multiple
attribute. When themultiple
attribute is specified, the file input allows the user to select more than one file. - Add square brackets
[]
to the name attribute. Adding square brackets to the name attribute submits multiple values as an array.
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { echo '<pre>'; print_r($_FILES); echo '</pre>'; } ?> <form action="example.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload[]" multiple> <input type="submit" name="submit" value="Upload"> </form>
You can see that the details of each file stored in a separate subarray. You can use the numeric keys to retrieve the details of each file, for example, the key 0
refer to the details of the first file in the array:
$_FILES['upload']['name'][0] $_FILES['upload']['type'][0] $_FILES['upload']['size'][0]
The key 1
refers to the details of the next file in the array and so on:
$_FILES['upload']['name'][1] $_FILES['upload']['type'][1] $_FILES['upload']['size'][1]
By running that array through a foreach
loop, you can access each file’s details, like this:
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { //$files = isset($_FILES['upload']) ? $_FILES['upload'] : array(); $files = $_FILES['upload'] ?? []; foreach ($files['name'] as $k => $v) { echo $files['name'][$k].'<br>'; echo $files['size'][$k].'<br>'; echo $files['type'][$k].'<br>'; echo $files['tmp_name'][$k].'<br>'; echo $files['error'][$k].'<br><br>'; } } ?> <form action="example.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload[]" multiple> <input type="submit" name="submit" value="Upload"> </form>
Uploading entire directory or folder recursively
The directory picker webkitdirectory
attribute in <input>
element with type="file"
allow you to select directories instead of files. To do so follow these steps:
<input type="file" name="upload[]" multiple webkitdirectory>
- Add
webkitdirectory
attribute. Use this directory picker attribute to select directories instead of files. - Add
multiple
attribute. When themultiple
attribute is specified, the file input allows the user to select more than one directory. - Add square brackets
[]
to the name attribute. Adding square brackets to the name attribute submits multiple values as an array.
Note: When the webkitdirectory attribute is specified, the entire content of the directory/folder is sent to the server including the subdirectories. You can recreate the same directory structure on the server with the help of full_path ($_FILES['upload']['full_path'][index]
) subkey.
The full path (full_path) is submitted by the browser, it does not always contain a real directory structure, and cannot be trusted.
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { $files = $_FILES['upload'] ?? []; foreach ($files['name'] as $k => $v) { if ($files['error'][$k] == UPLOAD_ERR_OK) { $name = $files['name'][$k]; // full_path available since PHP 8.1 $full_path = $files['full_path'][$k] ?? $name; // Browser didn't send the directory structure if ($name == $full_path ) { $uploadDir = 'upload/'; } else { //remove filename from the full_path $path = str_replace($name, '', $full_path); $uploadDir = 'upload/'.$path; //if dir not exist on the server, create it if (! is_dir($uploadDir) ) { mkdir ($uploadDir, 0777, true) or die("Failed to create directory: $uploadDir"); } } if ( is_uploaded_file($files['tmp_name'][$k]) ) { $m = move_uploaded_file($files['tmp_name'][$k], $uploadDir.'/'.$name); if ($m === true) echo "$name uploaded successfully<br>"; } } } } ?> <form action="example.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload[]" multiple webkitdirectory> <input type="submit" name="submit" value="Upload"> </form>
Note: You need to properly configure your PHP server or you’ll receive the following warning messages (depending on your server configuration):
- Warning: Maximum number of allowable file uploads has been exceeded…
- Warning: POST Content-Length of 68982407 bytes exceeds the limit of 41943040 bytes in Unknown on line 0
For detail, see Handling File Uploads tutorial.
Processing Forms in PHP: