feat: add base64 media registration method with support for multiple image formats and S3 storage

This commit is contained in:
Yoga Pangestu 2026-08-06 17:29:56 +07:00
parent 78965e9728
commit 66d6c843c3

View File

@ -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,