如何用AWS S3 PHP SDK限制预签名PutObject请求仅允许上传视频文件
我明白你现在遇到的困扰——用AWS S3 PHP SDK生成PutObject预签名URL时,想限制用户只能上传视频文件,但Conditions配置始终没生效对吧?我来帮你理清问题所在和正确的配置方式。
问题根源:Conditions配置格式错误
你示例里的Conditions写法不完整,而且PutObject预签名请求的条件配置需要严格遵循S3的规则,尤其是Content-Type的匹配逻辑。
正确的配置示例
下面是完整的可运行代码,包含视频文件类型的限制逻辑:
// 假设你的S3客户端已正确初始化 $cmd = $this->s3client->getCommand('PutObject', [ 'Bucket' => 'myBucket', 'Key' => 'inputs/' . $movie->getId(), 'ACL' => 'private', // 指定允许的Content-Type范围(支持通配符) 'Content-Type' => 'video/*', // 配置条件规则,确保上传的Content-Type符合要求 'Conditions' => [ // 匹配所有video开头的MIME类型(如video/mp4、video/mov等) ['starts-with', '$Content-Type', 'video/'], // 可选:添加文件大小限制(比如最大100MB) // ['content-length-range', 0, 104857600] ] ]); // 生成有效期1小时的预签名URL $request = $this->s3client->createPresignedRequest($cmd, '+3600 seconds'); $presignedUrl = (string)$request->getUri();
关键注意事项
- 条件格式必须正确:Conditions里的规则是数组结构,
$Content-Type的$符号不能省略,这是S3的变量约定。 - 明确指定Content-Type参数:在PutObject的参数里必须声明
Content-Type(用video/*通配所有视频类型,或指定具体类型如video/mp4),和Conditions规则形成配合。 - 客户端必须携带正确请求头:用户上传文件时,必须在请求中设置符合要求的
Content-Type头(比如video/mp4),否则S3会直接拒绝请求。 - 限制具体格式的写法:如果只想允许特定视频格式,把
starts-with换成eq,比如:['eq', '$Content-Type', 'video/mp4']
内容的提问来源于stack exchange,提问作者Raress96
相关产品推荐
相关产品推荐

