store/app/Http/Controllers/Admin/Media/PresignedUploadController.php
Yoga Pangestu d02af40836
Some checks failed
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
feat: implement presigned upload functionality for S3 in PresignedUploadController; update media upload handling across various components to support S3 keys and improve user experience
2026-07-02 14:28:51 +07:00

48 lines
1.5 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Media;
use App\Http\Controllers\Controller;
use Aws\S3\S3Client;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class PresignedUploadController extends Controller
{
public function presign(Request $request): JsonResponse
{
$validated = $request->validate([
'filename' => ['required', 'string', 'max:255'],
'mime_type' => ['required', 'string', 'max:100'],
]);
$extension = pathinfo($validated['filename'], PATHINFO_EXTENSION) ?: 'bin';
$key = 'temp/'.Str::uuid().'.'.$extension;
$s3 = new S3Client([
'region' => config('filesystems.disks.s3.region'),
'endpoint' => config('filesystems.disks.s3.endpoint'),
'use_path_style_endpoint' => config('filesystems.disks.s3.use_path_style_endpoint'),
'credentials' => [
'key' => config('filesystems.disks.s3.key'),
'secret' => config('filesystems.disks.s3.secret'),
],
]);
$command = $s3->getCommand('PutObject', [
'Bucket' => config('filesystems.disks.s3.bucket'),
'Key' => $key,
'ContentType' => $validated['mime_type'],
]);
$presignedUrl = (string) $s3->createPresignedRequest($command, '+15 minutes')->getUri();
return response()->json([
'key' => $key,
'url' => $presignedUrl,
'expires_at' => now()->addMinutes(15)->toISOString(),
]);
}
}