From 66d6c843c398158b002fd3c6d003296295eacfdd Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 6 Aug 2026 17:29:56 +0700 Subject: [PATCH] feat: add base64 media registration method with support for multiple image formats and S3 storage --- app/Services/Concerns/RegistersMedia.php | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/app/Services/Concerns/RegistersMedia.php b/app/Services/Concerns/RegistersMedia.php index de556cb..a93e8b2 100644 --- a/app/Services/Concerns/RegistersMedia.php +++ b/app/Services/Concerns/RegistersMedia.php @@ -3,11 +3,58 @@ namespace App\Services\Concerns; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Spatie\MediaLibrary\MediaCollections\Models\Media; trait RegistersMedia { + private function registerMediaFromBase64( + Model $model, + string $base64Data, + string $collectionName, + string $folder, + ): void { + $dataUrl = $base64Data; + $mime = 'image/jpeg'; + + if (preg_match('/^data:(.+?);base64,/', $dataUrl, $matches)) { + $mime = $matches[1]; + $dataUrl = preg_replace('/^data:.+?;base64,/', '', $dataUrl); + } + + $binary = base64_decode($dataUrl, true); + + if ($binary === false) { + return; + } + + $extension = match ($mime) { + 'image/png' => 'png', + 'image/webp' => 'webp', + 'image/gif' => 'gif', + default => 'jpg', + }; + + $date = now()->format('Y/m/d'); + $uuid = Str::uuid(); + $key = "{$folder}/{$date}/{$uuid}/photo.{$extension}"; + + Storage::disk('s3')->put($key, $binary, [ + 'ContentType' => $mime, + 'ACL' => 'public-read', + ]); + + $this->registerMedia( + model: $model, + s3Key: $key, + collectionName: $collectionName, + mimeType: $mime, + fileSize: strlen($binary), + orderColumn: 1, + ); + } + private function registerMedia( Model $model, string $s3Key,