Laravel s3 upload file with metadata using pre-signed url



PHP Snippet 1:

 public function presignedUpload(Request $request)
    {
        $this->validate($request, [
            'name' => 'string|required'
        ]);

        $s3 = Storage::disk('s3');
        $client = $s3->getDriver()->getAdapter()->getClient();
        $expiry = "+10 minutes";


        $options = ['user-data' => 'user-meta-value'];

        $cmd = $client->getCommand('PutObject', [
            'Bucket' => \Config::get('filesystems.disks.s3.bucket'),
            'Key' => 'path/to/file/' . $request->name,
            'ACL' => 'public-read',
            'Metadata' => $options,
        ]);

        $request = $client->createPresignedRequest($cmd, $expiry);

        $presignedUrl = (string)$request->getUri();

        return response()->json(['url' => $presignedUrl], 201);
    }

PHP Snippet 2:

    $uploadDisk = 's3';

    $s3Client = new S3Client([
        'credentials' => [
            'key' => config('filesystems.disks.' . $uploadDisk . '.key'),
            'secret' => config('filesystems.disks.' . $uploadDisk . '.secret'),
        ],
        'region' => config('filesystems.disks.' . $uploadDisk . '.region'),
        'version' => 'latest',
    ]);
    
    $s3Bucket = config('filesystems.disks.' . $uploadDisk . '.bucket');
    $s3Key = \Illuminate\Support\Str::uuid(); // your file name
    $s3Options = [];
    
    $command = $s3Client->getCommand('PutObject', [
        'Bucket' => $s3Bucket,
        'Key' => $s3Key,
        'MetaData' => $s3Options,
    ]);
    
    $request = $s3Client->createPresignedRequest($command, '+20 minutes');
    
    $url = (string) $request->getUri();