AWS S3 PHP SDK预先签名的url限制内容类型

时间:2018-04-02 14:25:51

标签: php amazon-web-services amazon-s3 aws-php-sdk

我正在尝试使用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,只包含主机。

1 个答案:

答案 0 :(得分:1)

putObject()请求没有记录Conditions密钥。

您似乎将S3的PUT上传界面与pre-signed POST功能混淆,后者支持['Starts-With', '$Content-Type', 'video/'],

等政策文件条件

PUT不支持“以...开头”。它需要完全 Content-Type,并且此密钥(应该导致标题出现在X-Amz-SignedHeaders查询字符串参数中)只是ContentType。它位于外部参数数组中,就像BucketKey

但是,如果您想在不事先了解特定类型的情况下支持多种内容类型,则需要使用POST上传。