How to send file as form data using laravel GuzzleHttpClient?
My upload.blade.php:
<!-- is enctype="multipart/form-data required here? -->
<form action="/upload-order" method="post" enctype="multipart/form-data">
{{csrf_field()}}
<p><input type="file" name="work_order" id="work_order"></p>
<p><input type="submit" value="Upload Work Order"></p>
</form>
My web routing:
Route::post('/orders-mgmt/upload-order', [ 'uses' => 'UploadController@uploadOrder' ])->name('upload-order');
My UploadController.php:
public static function uploadOrder(Request $request) {
if (!($request->hasFile('work_order'))) {
$message = "No file is selected.";
return redirect('/orders-mgmt/requests')->with('warnmessage', $message);
}
$file= $request->file('work_order');
$file_path = $file->getPathname();
$file_uploaded_name = $file->getClientOriginalName();
$resBody = (new UploadService($env))->uploadWorkOrderCSV($file_path, $file_uploaded_name);
...
}
My UploadService.php
public function uploadWorkOrderCSV($file_path, $file_uploaded_name) {
return json_decode($this->client->request(
'POST',
'v1/provision/upload-order',
[
'multipart' => [
'name' => 'work_order',
'contents' => fopen($file_path, 'r'),
'filename' => $file_uploaded_name
]
]
)->getBody());
}
I got the following error but I think the way I manipulate the form data is already wrong.
Type error: Argument 2 passed to GuzzleHttpPsr7MultipartStream::addElement() must be of the type array, string given, called in
The curl command below works for uploading file, how do I actually build the same request in my UploadService?
curl -X POST http://localhost:5000/v1/provision/upload-order -F 'work_order=@/C:/Users/kai/Desktop/Local/work_order.csv'
Advertisement
Answer
multipart values have to be in a nested array
public function uploadWorkOrderCSV($file_path, $file_uploaded_name) {
return json_decode($this->client->request(
'POST',
'v1/provision/upload-order',
[
'multipart' => [
[
'Content-type' => 'multipart/form-data',
'name' => 'work_order',
'contents' => fopen($file_path, 'r'),
'filename' => $file_uploaded_name
]
]
]
)->getBody());
}