OSS上传文件403,Invalid according to Policy: Policy expired.

最近在项目上线之后遇到了oss上传403的问题,查看返回信息提示Policy失效:
在这里插入图片描述
这里有一下两种基本情况:
1:expiration设置过短,生成获取Policy的接口和上传接口响应时间太长导致Policy失效。
2:Policy使用不正确,上传接口和生成Policy接口两个Policy不一致

但是我这里expiration是30秒接口响应都在1s内,很明显不是expiration设置过短的问题。
排查上传接口的Policy和key以及Bucket等都是正确的,所以也不是第二种情况。
到这里我就纳闷了。这是为什么。
终于在我一次次请求接口的时候发现服务里的时间比网络时间慢一分钟。
在这里插入图片描述
可以发现接口响应时间是10:58:02,但此时网络时间都跑到10:59了

WTF?这一下就发现了问题所在。因为主机时间比网络时间慢了一分钟,导致Policy在服务器上生成的Policy是一分钟之前的了,我设置的expiration就只有30s,所以到了oss服务那边自然就过期了。

解决办法:将expiration的时间设置长一点,或者修改好服务器上的时间。
我这边是联系运维同学,将服务器上的时间和网络时间保持一致了。随后问题完美解决。

### 关于 Policy Condition Failed 的解决方案 当遇到 `Policy Condition failed` 错误,尤其是与 `$key` 和 `starts-with` 条件相关的问题时,通常是因为上传请求中的字段未能匹配策略文件policy)中定义的条件。以下是针对该问题的具体分析和解决方法: #### 1. **确认 Policy 文件的内容** 确保 policy 中的 `conditions` 部分正确配置了 `$key` 字段的相关约束。例如,如果希望键名以 `image` 开头,则应在 conditions 数组中加入如下条目: ```json ["starts-with", "$key", "image"] ``` 此条目表示只有当上传对象的键名以字符串 `image` 开始时,才允许继续操作[^2]。 #### 2. **验证前端表单提交的数据** 在实际应用中,客户端需要通过 HTML 表单或其他方式向服务端发送 POST 请求。此时需注意以下几点: - 确认表单中包含名为 `key` 的隐藏输入项,并设置其值为符合预期前缀的路径或占位符模板。 ```html <input type="hidden" name="key" value="image/${filename}" /> ``` 上述代码片段展示了如何动态生成带有固定前缀 (`image`) 的目标存储路径,其中 `${filename}` 是 OSS 提供的一个变量替换机制[^2]。 - 如果使用编程语言构建 HTTP 请求而非传统网页形式,则同样要遵循类似的命名约定并填充相应参数。 #### 3. **检查 Content-Type 或其他附加元数据** 有时开发者还会额外指定某些自定义头部或者属性来增强功能特性。比如利用 x-amz-meta-* 前缀标记用户级信息等。这些都可能间接影响到最终判定逻辑因此也需要仔细核对是否存在冲突之处[^1]。 另外值得注意的一点是关于大小写敏感度方面的问题——尽管大多数情况下字母区分并不严格要求一致处理;然而为了保险起见还是建议统一采用小写字母书写习惯以便减少不必要的麻烦发生几率。 最后提醒一点就是记得测试完毕之后再次回顾整个流程看看有没有遗漏的地方再正式上线运行以免造成不可预料后果! ```python import json # 示例:构造一个简单的policy JSON串 policy = { "expiration": "2024-12-31T23:59:59Z", "conditions": [ ["starts-with", "$key", "image"], {"bucket": "your-bucket-name"} ] } print(json.dumps(policy)) ``` 以上代码演示了一个基本的policy结构创建过程,可以根据实际情况调整各个字段具体取值范围等内容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值