44
55use App \MediaUpload ;
66use Illuminate \Bus \Queueable ;
7+ use Illuminate \Http \UploadedFile ;
78use Illuminate \Queue \InteractsWithQueue ;
89use Illuminate \Queue \SerializesModels ;
910use Illuminate \Support \Collection ;
@@ -33,15 +34,11 @@ class BulkUploadMediaFiles extends Action
3334 */
3435 public function handle (ActionFields $ fields , Collection $ models )
3536 {
36- $ uploadedFiles = $ fields -> files ?? request ()-> file ( ' files ' );
37- if (! $ uploadedFiles ) {
37+ $ uploadedFiles = $ this -> collectUploadedFiles ( $ fields );
38+ if (empty ( $ uploadedFiles) ) {
3839 return Action::danger ('Please select one or more files. ' );
3940 }
4041
41- if (!is_array ($ uploadedFiles )) {
42- $ uploadedFiles = [$ uploadedFiles ];
43- }
44-
4542 $ allowedExtensions = [
4643 'jpg ' , 'jpeg ' , 'png ' , 'gif ' , 'webp ' , 'svg ' ,
4744 'pdf ' , 'doc ' , 'docx ' , 'ppt ' , 'pptx ' , 'xls ' , 'xlsx ' , 'txt ' ,
@@ -100,6 +97,7 @@ public function fields(NovaRequest $request): array
10097 File::make ('Files ' , 'files ' )
10198 ->withMeta ([
10299 'extraAttributes ' => [
100+ 'name ' => 'files[] ' ,
103101 'multiple ' => true ,
104102 'accept ' => '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt ' ,
105103 ],
@@ -109,6 +107,49 @@ public function fields(NovaRequest $request): array
109107 ];
110108 }
111109
110+ /**
111+ * Collect uploaded files from Nova action fields + raw request payload.
112+ *
113+ * @return UploadedFile[]
114+ */
115+ protected function collectUploadedFiles (ActionFields $ fields ): array
116+ {
117+ $ candidates = [];
118+
119+ if (isset ($ fields ->files )) {
120+ $ candidates [] = $ fields ->files ;
121+ }
122+
123+ $ requestFiles = request ()->allFiles ();
124+ if (!empty ($ requestFiles )) {
125+ $ candidates [] = $ requestFiles ;
126+ }
127+
128+ $ flatten = function ($ value ) use (&$ flatten ): array {
129+ if ($ value instanceof UploadedFile) {
130+ return [$ value ];
131+ }
132+
133+ if (!is_array ($ value )) {
134+ return [];
135+ }
136+
137+ $ result = [];
138+ foreach ($ value as $ item ) {
139+ $ result = array_merge ($ result , $ flatten ($ item ));
140+ }
141+
142+ return $ result ;
143+ };
144+
145+ $ files = [];
146+ foreach ($ candidates as $ candidate ) {
147+ $ files = array_merge ($ files , $ flatten ($ candidate ));
148+ }
149+
150+ return $ files ;
151+ }
152+
112153 /**
113154 * Indicate that this action can be run without any models.
114155 */
0 commit comments