Reputation: 19
Well, what happens is that I want to upload an image to Cloudinary through Laravel, I Follow the steps as it says on the documentation:
https://github.com/cloudinary-labs/cloudinary-laravel and here : https://cloudinary.com/blog/laravel_file_upload_to_a_local_server_or_to_the_cloud
I am using Laravel 8, here is my code:
public function store(Request $request){
$request->validate([
'name' => 'required|string|unique:festivals|max:255', //unique:table
'description' => 'required|string|max:255',
'image' => 'required|image|dimensions:min_width=200,min_height=200',
], self::$messages);
//Here I create an instance and upload file to server
$festival = new Festival($request->all());
$path = cloudinary()->upload($request->file('image')->getRealPath())->getSecurePath();
dd($path);
//Then at field image of festivals que save the path and that goes to the database
$festival->image = 'festivals/' . basename($path);
$festival->save();
return response() -> json($festival, 201); //code 201 created
}
When I try to create a new record through Postman, this happens:
Error after register new festival
However, the image was uploaded to Cloudinary:
Then I tried to check if the record was created, but it was not created.
What can I do, does anyone know?
Thanks
Upvotes: 0
Views: 1072
Reputation: 531
this is how i did it in laravel 10
I created a reusable client CloudinaryImageClient.php
<?php
namespace App\Integrations\files;
use Cloudinary\Api\Upload\UploadApi;
use Cloudinary\Configuration\Configuration;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log;
class CloudinaryImageClient
{
protected $cloudinaryInstance;
public function __construct()
{
$this->cloudinaryInstance = Configuration::instance([
'cloud' => [
'cloud_name' => Config::get('cloudinary.cloud_name'),
'api_key' => Config::get('cloudinary.api_key'),
'api_secret' => Config::get('cloudinary.api_secret')
],
'url' => [
'secure' => true
]]);
}
public function uploadImage(string $mimeType, string $base64FileContents): CloudinaryResults
{
$formattedUploadUri = self::createUri($mimeType, $base64FileContents);
try {
$uploadClient = new UploadApi();
$results = $uploadClient->upload($formattedUploadUri, ['resource_type' => 'image']);
Log::info("cloudinary upload results: " . json_encode($results));
return CloudinaryResults::success($results['secure_url'], $results['url']);
} catch (\Exception $e) {
Log::error("Failed to upload file to cloudflare $e");
return CloudinaryResults::failed($e->getMessage());
}
}
/**
* Utility function
*
* @param string $mimeType -- example image/jpeg
* @param string $base64FileContents
* @return string uploadUri in format 'data:image/jpeg;base64, LzlqLzRBQ... {Base64 image data}'
*/
private static function createUri(string $mimeType, string $base64FileContents): string
{
return 'data:' . $mimeType . ';base64,' . $base64FileContents;
}
}
Here is how i used the custom reusable client on a controller
class CustomerBooksController extends Controller
{
public function __construct()
{
}
public function uploadImage(Request $request): JsonResponse
{
$request->validate([
'image_file' => 'required|file',
]);
$cloudinaryClient = new CloudinaryImageClient();
$mimeType = $request->file('image_file')->getClientMimeType();
$base64Contents = base64_encode($request->file('image_file')->getContent());
$results = $cloudinaryClient->uploadImage($mimeType,$base64Contents);
return response()->json($results);
}
}
CloudinaryResults.php
<?php
namespace App\Integrations\files;
class CloudinaryResults
{
public bool $isSuccess;
public string $insecureUrl;
public string $secureUrl;
public string $msg;
public static function success(string $secureUrl, string $insecureUrl): CloudinaryResults
{
$results = new CloudinaryResults();
$results->isSuccess = true;
$results->secureUrl = $secureUrl;
$results->insecureUrl = $insecureUrl;
return $results;
}
public static function failed(string $msg): CloudinaryResults
{
$results = new CloudinaryResults();
$results->isSuccess = false;
$results->msg = $msg;
return $results;
}
}
Upvotes: 0
Reputation: 19
Ok, I Solved :)
//Here I create an instance and upload file to server
$festival = new Festival($request->all());
$result = $request->image->storeOnCloudinary();
//Here I get the url
$path = $result->getPath();
//Then at field image of festivals que save the path and that goes to the database
//$festival->image = $path; output: "https://res.cloudinary.com/test/image/upload/v1226931211/zuiyb17vfs8dre6gvuov.jpg"
//$festival->image = dirname($path); output: "https://res.cloudinary.com/test/image/upload/v1526711711"
//$festival->image = basename($path); output: "zuiy31lvfs4dre5gvuov.jpg"
$base = basename(dirname($path).basename($path)); //output: "v1636941221zuiyb14vfsmdre6gvuov.jpg"
$folder = substr($base, 0, -24); //output: "v1626915261"
//So:
$img_path = $folder.'/'.basename($path);
$festival->image = 'festivals/'.$img_path; //imageFolder/imageName.jpg;
But if someone has a best way, please tell me
Upvotes: 0