Я пытаюсь сделать предварительно назначенный запрос PutObject, используя AWS S3 PHP SDK.
Я получил запрос на работу, но теперь я хочу, чтобы мои пользователи могли загружать только видеофайлы. Я перепробовал много комбинаций и много искал, но не смог заставить его работать.
Вот пример кода, который я использую:
$cmd = $this->s3client->getCommand('PutObject', [
'Bucket' => 'myBucket',
'Key' => 'inputs/' . $movie->getId(),
'ACL' => 'private',
'Conditions' => ['Starts-With', '$Content-Type', 'video/'], // I have tried other combinations but it seems to not work
]);
$request = $this->s3client->createPresignedRequest($cmd, '+30 minutes');
$movie->setSignedUrl((string)$request->getUri());
Созданный подписанный URL-адрес никогда не включает Content-Type в параметр запроса X-Amz-SignedHeaders, только хост включен.
putObject()
запрос не документирован Conditions
ключ.
Вы, кажется, путаете S3 PUT
загрузить интерфейс с предварительно подписан POST
возможность, которая поддерживает условия документа политики, такие как ['Starts-With', '$Content-Type', 'video/'],
PUT
не поддерживает «начинается с». Это требует точный Content-Type
и ключ для этого (который должен привести к появлению заголовка в X-Amz-SignedHeaders
параметр строки запроса) просто ContentType
, Он идет во внешнем массиве параметров, так же, как Bucket
а также Key
,
Но если вы хотите поддерживать несколько типов контента, не зная заранее конкретного типа, вам нужно использовать POST
добавления.
Других решений пока нет …