2121use Ripple \Runtime \Support \Stdin ;
2222use Ripple \Stream \Exception \ConnectionException ;
2323use Symfony \Component \HttpFoundation \BinaryFileResponse ;
24+ use Symfony \Component \HttpFoundation \File \UploadedFile ;
2425use Throwable ;
2526
2627use function fopen ;
28+ use function file_exists ;
29+ use function is_array ;
30+
31+ use const UPLOAD_ERR_NO_FILE ;
32+ use const UPLOAD_ERR_OK ;
2733
2834/**
2935 *
@@ -42,7 +48,7 @@ public function marshalRequest(RequestContext $context): array
4248 $ rippleHttpRequest ->POST ,
4349 [],
4450 $ rippleHttpRequest ->COOKIE ,
45- $ rippleHttpRequest ->FILES ,
51+ $ this -> parseFiles ( $ rippleHttpRequest ->FILES ) ,
4652 $ rippleHttpRequest ->SERVER ,
4753 $ rippleHttpRequest ->CONTENT ,
4854 );
@@ -98,4 +104,37 @@ public function error(Throwable $e, Application $app, Request $request, RequestC
98104 {
99105 Stdin::println ($ e ->getMessage ());
100106 }
107+
108+ /*** @return array<string, array<UploadedFile>> */
109+ protected function parseFiles (array $ files ): array
110+ {
111+ if (empty ($ files )) {
112+ return [];
113+ }
114+
115+ $ parsed = [];
116+ foreach ($ files as $ name => $ items ) {
117+ if (!is_array ($ items )) {
118+ continue ;
119+ }
120+
121+ if (isset ($ items [0 ]['path ' ]) && is_array ($ items [0 ])) {
122+ $ parsed [$ name ] = [];
123+ foreach ($ items as $ item ) {
124+ $ path = $ item ['path ' ];
125+ $ parsed [$ name ][] = new UploadedFile (
126+ $ path ,
127+ $ item ['fileName ' ] ?? '' ,
128+ $ item ['contentType ' ] ?? 'application/octet-stream ' ,
129+ file_exists ($ path ) ? UPLOAD_ERR_OK : UPLOAD_ERR_NO_FILE ,
130+ true
131+ );
132+ }
133+ } else {
134+ $ parsed [$ name ] = $ items ;
135+ }
136+ }
137+
138+ return $ parsed ;
139+ }
101140}
0 commit comments