You can allow multiple file selections by creating more than one file element but you can easily do this with just a single file element.
It consumes less space and easy to handle but for this, you need to customize the element.
In this tutorial, I am using AngularJS and PHP to upload multiple files to the servers.
I am creating a custom directive to handle file selection in AngularJS.

Contents
1. HTML
For enabling multiple files selection add multiple attribute on the type='file' element and also define ng-file='uploadfiles' directive.
To upload the file on a button click define ng-click='upload()' directive.
The <p> is only used to display the response data after the successful upload.
Completed Code
<body ng-app='myapp'>
<div ng-controller="userCtrl">
<input type='file' multiple ng-file='uploadfiles'><br/>
<input type='button' value='Upload' id='upload' ng-click='upload()' >
<p>{{ response.name }}</p>
</div>
</body>
2. PHP
Create a new upload.php file and a upload folder for storing files.
Find the total number of selected files by counting $_FILES array. Loop on each file for upload and initialize $filename_arr with the file name.
Completed Code
<?php
/* Location */
$location = 'upload/';
// Count total files
$countfiles = count($_FILES['file']['name']);
$filename_arr = array();
// Looping all files
for ( $i = 0;$i < $countfiles;$i++ ){
$filename = $_FILES['file']['name'][$i];
// Upload file
if(move_uploaded_file($_FILES['file']['tmp_name'][$i],$location.$filename)){
$filename_arr[] = $filename;
}
}
$arr = array('name' => $filename_arr);
echo json_encode($arr);
3. AngularJS
Create a custom controller using .directive to handle files and initialize FormData object. Send a $http request where pass the FormData object for uploading.
Completed Code
var upload = angular.module('myapp', []);
upload.directive('ngFile', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.bind('change', function(){
$parse(attrs.ngFile).assign(scope,element[0].files)
scope.$apply();
});
}
};
}]);
upload.controller('userCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.upload = function(){
var fd = new FormData();
angular.forEach($scope.uploadfiles,function(file){
fd.append('file[]',file);
});
$http({
method: 'post',
url: 'upload.php',
data: fd,
headers: {'Content-Type': undefined},
}).then(function successCallback(response) {
// Store response data
$scope.response = response.data;
});
}
}]);
4. Conclusion
While enabling multiple files selection make sure to add multiple attribute on the file element and use FormData object to pass the file through $http service request.
You can view this tutorial to know single file upload with AngularJS and PHP.
If you found this tutorial helpful then don't forget to share.