#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);
}