Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

qleapbs's avatar

Uploading multiple files to Lumen API from Laravel

I have a Lumen API were one of the routes is as given below:

$router->group(['prefix' => 'api/v1'], function() use ($router) {
        $router->group(['prefix' => 'user'], function() use ($router) {
                $router->post('/fund', 'User\FundsController@create');
        });
});

This route accepts 2 files. Controller code is as given below:

public function create(Request $request) {
        $validator = Validator::make($request->all(), [
                'field1' => 'required|string|exists:colleges,id',
                'field2' => 'required|string|max:250',
                'field3' => 'required|date',
                'field4' => 'required|date',
                'file1'  => 'required|file',
                'file2'  => 'required|file'
        ]);

        if ($validator->fails()) {
                return response()->json(['status' => false, 'message' => $validator->errors()], 409);
        }

        try {
                $filename1 = $this->uploadFile1($request);
                $filename2 = $this->uploadFile2($request);

                $event         = new Event;
                $event->id     = Str::random(24);
                $event->field1 = $request->input('field1');
                $event->field2 = $request->input('field2');
                $event->field3 = $request->input('field3');
                $event->field4 = $request->input('field4');
                $event->file1  = $filename1;
                $event->file2  = $filename2;
                $event->save();

                return response()->json(['status' => true, 'message' => 'Event saved successfully'], 201);
        } catch (\Exception $e) {
                return response()->json(['status' => false, 'message' => 'Event couldn\'t be saved'], 409);
        }
}

It was successfully tested by Postman.

However, I am unable to make a request to this API from my Laravel Application. Controller code is:

public function addFund(Request $request) {
        // OPTION 1: USING LARAVEL HTTP CLIENT

        $responseObj = Http::attach(
                'file1', $request->file('fileinput1')
        )->post('http://localhost:8001/api/v1/user/fund', [
                'field1' => session('id'),
                'field2' => $request->input('textinput1'),
                'field3' => $request->input('textinput2'),
                'field4' => $request->input('textinput3')
        ]);
        $responseJson = $responseObj->json();

        if ($responseObj->status() == 200) {
                return response()->json([
                        'status'  => true,
                        'message' => $responseJson['message']
                ]);
        } else {
                return response()->json([
                        'status' => false,
                        'errors' => $responseJson['message']
                ]);
        }

        // OPTION 2: USING GUZZLE HTTP CLIENT

        $client = new Client();
        $responseObj = $client->request('POST', 'http://localhost:8001/api/v1/user/fund', [
                'multipart' => [
                        [
                                'name'     => 'field1',
                                'contents' => session('id')
                        ], [
                                'name'     => 'field2',
                                'contents' => $request->input('textinput1')
                        ], [
                                'name'     => 'field3',
                                'contents' => $request->input('textinput2')
                        ], [
                                'name'     => 'field4',
                                'contents' => $request->input('textinput3')
                        ], [
                                'name'     => 'file1',
                                'contents' => $request->file('fileinput1')
                        ], [
                                'name'     => 'file2',
                                'contents' => $request->file('fileinput2')
                        ]
                ]
        ]);

        if ($responseObj->getStatusCode() == 200) {
                return response()->json([
                        'status'  => true,
                        'message' => json_decode($responseObj->getBody()->getContents(), true)
                ]);
        } else {
                return response()->json([
                        'status' => false,
                        'errors' => json_decode($responseObj->getBody()->getContents(), true)
                ]);
        }
}

Please note that I have only used either Option 1 or Option 2 here. But both are failing, with the error message as:

{
        "status"  : false,
        "message" : {
                "file1" : [
                        "The file1 must be a file."
                ],
                "file2" : [
                        "The file2 must be a file."
                ]
        }
}

So the help I need is this. What is the right way to pass multiple files (which you receive from a web page) to a Lumen endpoint via Laravel Controller?

0 likes
0 replies

Please or to participate in this conversation.