我正在尝试使用AWS S3 PHP SDK制作PutObject预先签名的请求。
我已经得到了工作请求,但现在我只想让我的用户只能上传视频文件。我已经尝试了很多组合并搜索了很多但是我无法让它工作。
以下是我使用的示例代码:
$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());
生成的签名网址永远不会在X-Amz-SignedHeaders查询参数中包含Content-Type,只包含主机。
答案 0 :(得分:1)
putObject()
请求没有记录Conditions
密钥。
您似乎将S3的PUT
上传界面与pre-signed POST
功能混淆,后者支持['Starts-With', '$Content-Type', 'video/'],
PUT
不支持“以...开头”。它需要完全 Content-Type
,并且此密钥(应该导致标题出现在X-Amz-SignedHeaders
查询字符串参数中)只是ContentType
。它位于外部参数数组中,就像Bucket
和Key
。
但是,如果您想在不事先了解特定类型的情况下支持多种内容类型,则需要使用POST
上传。