1212use Carbon \CarbonInterface ;
1313use Closure ;
1414use Illuminate \Http \Request ;
15+ use Illuminate \Http \UploadedFile ;
1516use Illuminate \Support \Facades \Storage ;
17+ use RuntimeException ;
1618
1719class File extends Field implements DeletableContract, StorableContract
1820{
@@ -81,8 +83,11 @@ public function storeAs($storeAs): self
8183 *
8284 * @return $this
8385 */
84- public function resolveUsingTemporaryUrl (bool $ resolveTemporaryUrl = true , ?CarbonInterface $ expiration = null , array $ options = []): self
85- {
86+ public function resolveUsingTemporaryUrl (
87+ bool $ resolveTemporaryUrl = true ,
88+ ?CarbonInterface $ expiration = null ,
89+ array $ options = []
90+ ): self {
8691 if (! $ resolveTemporaryUrl ) {
8792 return $ this ;
8893 }
@@ -161,13 +166,32 @@ public function storeSize($column)
161166 return $ this ;
162167 }
163168
169+ protected function resolveFileFromRequest (Request $ request ): ?UploadedFile
170+ {
171+ if (($ file = $ request ->input ($ this ->attribute )) instanceof UploadedFile && $ file ->isValid ()) {
172+ return $ file ;
173+ }
174+
175+ if (($ file = $ request ->file ($ this ->attribute )) && $ file ->isValid ()) {
176+ return $ file ;
177+ }
178+
179+ return null ;
180+ }
181+
164182 protected function storeFile (Request $ request , string $ requestAttribute )
165183 {
184+ $ file = $ this ->resolveFileFromRequest ($ request );
185+
186+ if (! $ file ) {
187+ throw new RuntimeException ("No valid file found in the request for attribute {$ requestAttribute }" );
188+ }
189+
166190 if (! $ this ->storeAs ) {
167- return $ request -> file ( $ requestAttribute ) ->store ($ this ->getStorageDir (), $ this ->getStorageDisk ());
191+ return $ file ->store ($ this ->getStorageDir (), $ this ->getStorageDisk ());
168192 }
169193
170- return $ request -> file ( $ requestAttribute ) ->storeAs (
194+ return $ file ->storeAs (
171195 $ this ->getStorageDir (),
172196 is_callable ($ this ->storeAs ) ? call_user_func ($ this ->storeAs , $ request ) : $ this ->storeAs ,
173197 $ this ->getStorageDisk ()
@@ -196,7 +220,7 @@ public function store($storageCallback): self
196220 */
197221 protected function mergeExtraStorageColumns ($ request , array $ attributes ): array
198222 {
199- $ file = $ request -> file ( $ this -> attribute );
223+ $ file = $ this -> resolveFileFromRequest ( $ request );
200224
201225 if ($ this ->originalNameColumn ) {
202226 $ attributes [$ this ->originalNameColumn ] = $ file ->getClientOriginalName ();
@@ -229,6 +253,10 @@ protected function columnsThatShouldBeDeleted(): array
229253
230254 public function fillAttribute (RestifyRequest $ request , $ model , ?int $ bulkRow = null )
231255 {
256+ if ($ this ->storeCallback instanceof Closure) {
257+ return call_user_func ($ this ->storeCallback , $ request , $ model , $ this ->attribute );
258+ }
259+
232260 // Handle URL input first
233261 if ($ request ->has ($ this ->attribute ) && is_string ($ request ->input ($ this ->attribute ))) {
234262 $ url = $ request ->input ($ this ->attribute );
@@ -254,8 +282,7 @@ public function fillAttribute(RestifyRequest $request, $model, ?int $bulkRow = n
254282 }
255283 }
256284
257- // Existing file upload logic
258- if (is_null ($ file = $ request ->file ($ this ->attribute )) || ! $ file ->isValid ()) {
285+ if (! $ this ->resolveFileFromRequest ($ request )) {
259286 return $ this ;
260287 }
261288
0 commit comments