Skip to content
Advertisement

PHP laravel frontend how to upload/send csv file to backend api?

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());
}
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement