Unity游戏向AWS上传文件遇400错误,表单key参数设置疑问
AWS S3 文件上传 400 错误排查:Key 参数设置分析
看起来你在Unity游戏向AWS S3上传文件时遇到了400错误,先给你吃个定心丸:你设置key: AffectivaLogs/${filename}的语法本身是正确的——AWS S3的POST表单上传确实支持用${filename}变量来保留上传文件的原始名称,把文件归类到AffectivaLogs/前缀下的写法完全符合规范。
那为什么会返回400错误呢?通常这类错误是请求不符合S3的表单上传要求,下面是几个常见的排查方向:
1. 预签名表单的策略(Policy)配置不匹配
S3的POST上传依赖预签名的Policy文档来限制请求的合法性,你需要确认:
- 生成预签名表单时,Policy里是否包含了
key的匹配条件,比如:
如果Policy里限制了["starts-with", "$key", "AffectivaLogs/"]key必须以特定前缀开头,而你的设置不符合这个规则,就会直接返回400。 - 检查Policy的签名是否有效,有没有过期,或者签名使用的AWS密钥是否拥有
s3:PutObject等必要权限。
2. 表单参数不完整或格式错误
AWS POST上传需要多个必填参数,少一个或者格式不对都会触发400:
- 确保你已经将所有必要参数添加到表单中,比如
policy、signature、x-amz-date(如果使用签名版本4)、x-amz-credential等,这些参数通常由后端生成预签名表单时提供。 - 注意参数的大小写,比如
key必须是小写,不能写成Key,参数名写错也会导致请求失败。
3. ${filename}变量未被正确解析
如果你的Unity代码是手动构建表单数据,需要确认:
/${filename}这个占位符没有被HTTP库转义(比如变成%24%7Bfilename%7D),如果实际发送的key值是字面量AffectivaLogs/${filename}而不是替换成真实的文件名,S3会因为不符合Policy规则而拒绝请求。- 可以在Unity里打印出发送的表单数据,检查
key的实际值是否正确替换成了目标文件名。
4. S3桶的CORS配置问题
如果你的Unity应用是从前端(比如WebGL)发起请求,需要检查S3桶的CORS规则:
- 是否允许你的应用域名(或测试用的
localhost)发起POST请求。 - 是否允许包含
key在内的必要表单字段,比如在CORS规则里添加AllowedHeaders为*(测试阶段)或者明确列出需要的头部。
快速排查建议
你可以先用Postman或curl手动模拟表单上传请求:
- 把Unity里构建的所有表单参数复制到Postman的表单数据中。
- 上传一个测试文件,发起POST请求到S3的上传端点。
- 如果Postman也返回400,说明问题出在AWS的配置(Policy、权限、CORS)上。
- 如果Postman成功,那问题大概率在Unity的代码里,比如参数拼接错误、变量未替换等。
内容的提问来源于stack exchange,提问作者Vipin Verma
相关产品推荐
相关产品推荐

