Laravel s3 загружает файл с метаданными, используя предварительно подписанный URL

#php #laravel #amazon-web-services #amazon-s3

Вопрос:

Я реализую загрузку и загрузку файлов S3 с использованием предварительно подписанных URL-адресов. У меня есть одно хранилище s3 (включено управление версиями) и один пользователь AWS, но я хочу отслеживать историю каждого файла с точки зрения того, кто из пользователей моего приложения изменил файл.

У меня есть версионная корзина S3, и я думаю, что могу добавлять метаданные в каждый файл, чтобы идентифицировать пользователя моего приложения и, возможно, другие данные.

Вот мой код:

     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',
        ], $options);

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

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

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

 

Я пришел к выводу, что могу передать $options массив из FilesystemAdapter::class . Этот код действительно загружает файл, но метаданные в AWS выглядят пустыми.

Мой $options массив в неправильном формате?

Буду признателен за любую помощь в этом вопросе.

Ответ №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);
    }