Я использую прямые загрузки s3 вместе с базой данных для хранения URL файлов (наряду с другими данными, например, кто загрузил и т. Д.).
Чтобы разрешить прямую загрузку на s3, я создаю заданный URL-адрес, например:
$s3 = App::make('aws')->createClient('s3', [
'credentials' => [
'key' => 'AAAAAAAAAAAAAAA',
'secret' => 'YYYYYYYYYYYYYYYYYYYY',
]
]);$command = $s3->getCommand('PutObject', [
'@use_accelerate_endpoint'=>true,
'Bucket' => 'remdev-experimental',
'Key' => "newest newest.txt",
'Metadata' => array(
'foo' => "test",
)
]);return response()->json(((string)$s3->createPresignedRequest($command, '+1 minutes')->getUri()));
Теперь, после завершения загрузки файла с клиента, я хочу, чтобы мой сервер знал об этом. Поэтому я буду требовать от клиента отправки мне запроса, уведомляющего о том, что он закончил загрузку. Для этого, я думаю, самый простой (и безопасный) способ — просто позволить клиенту отправить обратно подписанный URL, который он только что отправил.
Есть ли способ разобрать URL?
Я заинтересован в получении ключа объекта и, что более важно, я хочу убедиться, что URL не был подделан (то есть подпись в URL должна совпадать с остальным содержимым). Как я могу сделать это в php sdk?
Подписанный URL-адрес — это URL-адрес файла с информацией о подписи в данных запроса. Итак, подписанный запрос на ведро: remdev-experimental
файл: abc.txt
похоже https://s3.amazonaws.com/remdev-experimental/abc.txt?X-Amz-Date=date&X-Amz-Expires=60&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=signature&X-Amz-Credential=SOMEID/20160703/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=some-long-token
так что все, что вам нужно сделать, это получить путь к URL (/remdev-experimental/abc.txt
и возьми все после 2-го слеша.
Также вы должны знать, что вы можете иметь S3 перенаправить браузер на URL с помощью success_action_redirect
в HTTP post policy
Наконец, вы можете заставить S3 инициировать уведомление на ваш сервер (через SQS, SNS или Lambda) при каждой загрузке файла.
Других решений пока нет …