Aug 13, 2020
0
Level 1
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?
Please or to participate in this conversation.