使用Policy Document配置GCS文件上传时遇InvalidPolicyDocument错误求助
解决GCS InvalidPolicyDocument 错误:词法解析问题
核心错误原因
你遇到的InvalidPolicyDocument错误,细节里的Lexical Error: Unmatched Input: <'>已经明确指向了问题——你的Policy Document使用了单引号('),但JSON规范强制要求双引号(")来包裹所有键和字符串值。
当解码表单里的policy字段值时,会看到它是用单引号编写的:
{'conditions': [ ['starts-with', '$key', '' ], {'acl': 'bucket-owner-read' }, {'bucket': 'cli201509.appspot.com'}, {'success_action_redirect': 'http://cli201509.appspot.com/getpolicydocumentsuccess' }, ['eq', '$Content-Type', 'image/jpeg' ], ['content-length-range', 0, 1000000] ], 'expiration': '2020-06-16T11:11:11Z'}
这种格式不符合JSON语法,GCS的解析器无法识别,所以抛出了词法错误。
分步解决办法
1. 修复Policy Document的JSON格式
把所有单引号替换成双引号,确保JSON完全合规。正确的Policy Document应该是:
{"expiration": "2020-06-16T11:11:11Z", "conditions": [ ["starts-with", "$key", "" ], {"acl": "bucket-owner-read" }, {"bucket": "cli201509.appspot.com"}, {"success_action_redirect": "http://cli201509.appspot.com/getpolicydocumentsuccess" }, ["eq", "$Content-Type", "image/jpeg" ], ["content-length-range", 0, 1000000] ] }
你可以用本地的jq命令或JSON校验工具确认格式正确。
2. 重新生成URL-safe Base64编码的Policy
GCS要求Policy必须是URL-safe的Base64编码:
- 先把修复后的JSON字符串转换成UTF-8字节流
- 进行Base64编码
- 替换编码结果中的
+为-,/为_,并去掉末尾的=字符
3. 重新生成Signature
用你的服务账号私钥,对新生成的Base64编码Policy进行HMAC-SHA256签名,然后把签名结果也转换成URL-safe的Base64编码,替换表单里的signature字段值。
额外的表单优化建议
为了避免后续潜在问题,还可以调整这两个表单细节:
- 表单Action地址:把
action="http://storage.googleapis.com"改成action="https://storage.googleapis.com/cli201509.appspot.com",直接指向你的bucket,更符合GCS的POST上传规范。 - Key字段值:当前
key值是cli201509.appspot.com/texst/textasad.jpg,但GCS的key是bucket内的文件路径,不需要包含bucket名称,建议改成texst/textasad.jpg,否则会在bucket里创建一个冗余的前缀文件夹。
完成以上步骤后,替换表单里的policy和signature字段,重新测试上传,应该就能解决这个解析错误了。
内容的提问来源于stack exchange,提问作者bhavin jalodara
相关产品推荐
相关产品推荐

