1
votes

I have a flutter form which contains both textual data and an image. I am using http package to send post request to the Laravel backend that has a route in api.php like:

Route::post('/locations', 'LocationController@store');

So at first since I have never tried to upload an image to laravel I had to disable my image input just to check if things were working and and I was successfully able to send a post request from my frontend with a status code of 201 Created with the record successfully created in the database. So I have added the first two lines below in my controller to save the image which are causing my requests to fail with 500 | server error. (The rest lines were already available and working with previous requests):

public function store(Request $request)
{
    $locationName = $request["name"];
    $data = base64_decode($request["image"]); // Image sent from flutter like: _image != null ? base64Encode(_image.readAsBytesSync()) : ''
    Storage::disk('public_images')->put("${$locationName}.jpg", $data); // public_images is defined below
    return location::create([
        'name' => $request["name"], 
        'time' => $request["time"],
        'package' => $request["package"],
        'summary' => $request["summary"],
        'info' => $request["info"],
        'image' => $request["image"]
        ]);
}

I have defined the public_images disk(in config/filesystems.php) as follows: (I have to save in the public directory because my server doesn't work with symlinks, but that isn't my problem):

'public_images' => [
        'driver' => 'local',
        'root'   => public_path() . '/images',
    ],

Now What I want is to save the image to the disk and get the path to store it to the database table so that when accessing from flutter I will only use the api url along with that path to display the image as a network resource. So what is the right way to upload a file from flutter app to laravel backend? Or am I doing it all wrong?

Also: since I am new to file uploads in laravel from flutter, what generally are the best practices in uploading files to a laravel server? Thanks in advance!

1

1 Answers

0
votes

You may want to check if request object has any file and the file is valid, then store the file in public directory and store the uri in db.

if($request->hasFile('image') && $request->file('image')->isValid()){
   $file = $request->file('image');
   $filePath = str_replace('public/', '', $file->storeAs('public/dir', 'name.' . $file->guessExtension()));
}

now with Laravel baseUrl helper you can generate the full path of stored file and using for loading, streaming or force to download.