You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:06