概述
本文主要介绍调用PostObject接口出现的常见错误及解决方法。
详细信息
调用PostObject接口出现问题时,您可以参见PostObject,确认调用的配置是否正常。若问题没有解决,请参考以下内容。
PostObject常见报错
常见报错 | 原因 | 解决方法 |
---|---|---|
ErrorCode: MalformedPOSTRequest ErrorMessage: The body of your POST request is not well-formed multipart/form-data | 表单域格式不符合要求。 | 表单域格式请参见PostObject表单域格式。 |
ErrorCode: InvalidAccessKeyId ErrorMessage: The OSS Access Key Id you provided does not exist in our records. | AccessKeyID 禁用或不存在,或者过期的临时用户AccessKeyID,或者临时用户没有提供STS Token。 |
排查方法请参见InvalidAccessKeyId错误排查。 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy expired. | 表单域Policy中的expiration 过期。 |
请调整Policy中的expiration ,注意expiration的格式ISO8601 GMT。 |
ErrorCode: AccessDenied ErrorMessage: SignatureDoesNotMatch The request signature we calculated does not match the signature you provided. Check your key and signing method. | 签名错误。 | 签名方法请参见PostObject的签名。 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid Simple-Condition: Simple-Conditions must have exactly one property specified. | 请求中Policy 至少包含一个condition。 |
具体方法请参见PostObject的Policy格式。 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid JSON: unknown char e | 请求中的Policy 格式不正确。 |
请检查Policy格式," 是否缺失,转义字符前是否有\ 。 |
ErrorCode: InvalidPolicyDocument ErrorMessage: Invalid Policy: Invalid JSON: , or ] expected | 请求中的Policy 格式不正确。 |
请检查Policy中是否缺少, 或] 。 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“starts-with”, “$key”, “user/eric/“] | 请求指定的Key 与Policy 限定的不符。 |
请检查请求中表单域Key 的值。 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“eq”, “$bucket”, “mingdi-bjx”] | 请求指定Bucket 与Policy 限定的不符。 |
请检查endpoint中的Bucket 的值。 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“starts-with”, “$x-oss-meta-prop”, “prop-“] | 请求指定的文件元数据x-oss-meta-prop 与policy限定的不符。 |
请检查请求中的x-oss-meta-prop 的值。 |
ErrorCode: AccessDenied ErrorMessage: Invalid according to Policy: Policy Condition failed: [“eq”, “${field}”, “${value}”] | 表单域中指定的{field} 与Policy 中限定的值不符,或者在请求中没有指定。 |
请检查请求中的{field} 的值。 |
ErrorCode: AccessDenied ErrorMessage: You have no right to access this object because of bucket acl. | 当前用户无权限。 | 请参见OSS权限问题及排查。 |
ErrorCode: InvalidArgument ErrorMessage: The bucket POST must contain the specified ‘key’. If it is specified, please check the order of the fields | 表单域没有指定Key ,或者放在了表单域file 后。 |
请添加表单域Key 或调整顺序。 |
PostObject常见问题
问题 |
解决方法 |
---|---|
如何指定Key。 |
Key即Object name,在表单域Key中指定,示例如下所示。 Content-Disposition: form-data; name="key" {key} --9431149156168 |
如何指定Object内容。 |
Object内容通过表单域 Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png {file-content} --9431149156168
|
如何指定Object类型content-type。 |
Object类型在表单域file中指定Content-Type,而不是Header中的Content-Type,示例如下所示。 Content-Disposition: form-data; name="file"; filename="images.png" |
如何指定Object内容MD5校验content-md5。 |
在PostObject请求头中指定 POST / HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6) Content-Type: multipart/form-data; boundary=9431149156168 Content-MD5: tdqHe4hT/TuKb7Y4by+nJg== Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Content-Length: 5246 --9431149156168 |
如何指定签名Signature。 |
签名的计算方法请查看PostObject中的签名,签名通过表单域 |
如何使用临时用户STS Token执行PostObject。 |
临时用户密钥的AccessKeyID、AccessKeySecret用法跟主用户、子用户相同,Token放在表单域 Content-Disposition: form-data; name="Signature" 5L0+KaeugxYygfqWLJLoy0ehOmA= --9431149156168 Content-Disposition: form-data; name="x-oss-security-token" {Token} --9431149156168 说明:如果您想了解更多访问控制的信息,请参见阿里云访问控制。 |
如何指定上传回调(Callback)。 |
上传回调通过表单域 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0= --9431149156168 Callback的自定义参数也是通过表单域携带,示例如下所示。 Content-Disposition: form-data; name="x:var1" {var1-value} --9431149156168 说明:如果您想了解Callback更多内容,请参见上传回调。 |
如何指定Content-Transfer-Encoding。 |
在表单域 Content-Disposition: form-data; name="file"; filename="images.png" Content-Type: image/png Content-Transfer-Encoding: base64 {file-content} --9431149156168 |
如何指定用户自定义元信息Object User Meta。 |
用户自定义元信息,可以通过表单域指定,示例如下所示。 Content-Disposition: form-data; name="x-oss-meta-uuid" {uuid} --9431149156168 Content-Disposition: form-data; name="x-oss-meta-tag" {tag} --9431149156168 说明:文件元信息更详细的说明,请参见文件元信息Object Meta。 |
如何指定限定条件expiration、Key、Bucket、size、Header等。 |
OSS的PostObject支持丰富的条件限制,可以满足高安全性要求。限定条件Conditions可以通过表单域Policy 指定,详细的说明请查看上面的PostObject的Policy格式。Policy的示例如下所示。 { "expiration": "2018-01-01T12:00:00.000Z", "conditions": [ ["eq", "[$Bucket]", "md-hz"], ["starts-with", "[$Key]", "md/conf/"], ["content-length-range", 0, 104857600] ] } 上面的Policy实例中,用户的PostObject操作的限定条件如下:
|
如何指定Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires等HTTP Header。 |
Cache-Control Content-Type、Content-Disposition、Content-Encoding、Expires等HTTP Header需要在表单域中指定,这些HTTP Header的含义请参见RFC2616 。但是Content-MD5需要在Post Header中指定。 |
PostObject示例
PostObject表单域格式
- PostObject请求格式,有以下注意点:
- Header一定要有
Content-Type: multipart/form-data; boundary={boundary}
。 - Header和Body之间由
\r\n--{boundary}
分割。 - 表单域格式如下所示。
Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}
- 表单域名称大小写敏感,如Policy、Key、file、OSSAccessKeyId、OSSAccessKeyId、Content-Disposition。
注意:表单域
file
必须为最后一个表单域。 - Bucket为
public-read-write
时,可以不指定表单域OSSAccessKeyId、Policy、Signature,一旦指定OSSAccessKeyId、Policy、Signature中的任意一个,无论Bucket是否为public-read-write,则另两个必须指定。
- Header一定要有
- PostObject请求的示例如下所示。
POST / HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6) Content-Type: multipart/form-data; boundary=9431149156168 Host: mingdi-hz.oss-cn-hangzhou.aliyuncs.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Content-Length: 5052 --9431149156168 Content-Disposition: form-data; name="key" test-key --9431149156168 Content-Disposition: form-data; name="Content-Disposition" attachment;filename=D:\img\1.png --9431149156168 Content-Disposition: form-data; name="OSSAccessKeyId" 2NeL********j2
说明:
- 以上示例请求中
\r\n
显示为新行,即换行,后面的示例请求类似。 - 以上示例为部分内容,完整的请求请参见PostObject。
- 以上示例请求中
- 如果您还有疑问,请参考如下示例代码:
PostObject的Policy格式
- PostObject请求的
Policy
表单域用于验证请求的合法性,声明了PostObject请求必须满足的条件。限定条件如下所示。- UTF-8格式的JSON文本,经过base64编码后放在表单域Policy中。
- Policy中必须包含expiration和condtions,其中condtions至少有一项。
- 下面是base64编码前的Policy示例,expiration项指定了请求的过期时间,使用的是ISO8601 GMT时间格式,例如:2018-01-01T12:00:00.000Z,指定请求必须发生在2018年1月1日12点前。
{
"expiration": "2018-01-01T12:00:00.000Z",
"conditions": [
["content-length-range", 0, 104857600]
]
} - Post Policy支持的限定条件(Conditions)如下所示。
名称 描述 示例 Bucket 上传文件的Bucket名称。支持精确匹配方式。 {“bucket”: “johnsmith” } 或 [“eq”, “$bucket”, “johnsmith”] Key 上传文件的名称。支持精确匹配和前缀匹配方式。 [“starts-with”, “$key”, “user/etc/”] content-length-range 上传文件允许的最小、最大长度。 [“content-length-range”, 0, 104857600] x-oss-meta-* 指定的Object meta。支持精确匹配和前缀匹配方式。 [“starts-with”, “$x-oss-meta-prop”, “prop-“] success_action_redirect 上传成功后的跳转URL地址。支持精确匹配和前缀匹配方式。 [“starts-with”, “$success_action_redirect”, “http://www.aliyun.com”] success_action_status 未指定success_action_redirect时,上传成功后的返回状态码。支持精确匹配和前缀匹配方式。 [“eq”, “$success_action_status”, “204”] Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires等 HTTP请求头,作为表单域传递。支持精确匹配和前缀匹配方式。 [“eq”, “$Content-Encoding”, “ZLIB”] - Post Policy有以下转义字符,使用
\
转义。
转义字符 描述 \/ 斜杠 \ 反斜杠 \” 双引号 \$ 美元符 \b 空格 \f 换页 \n 换行 \r 回车 \t 水平制表符 \uxxxx Unicode字符 - Post Policy更详细的说明,请参见Post Policy。
PostObject的签名
- 对于验证的Post请求,请求中必须包含AccessKeyID、Policy、Signature表单域。计算签名的流程如下。
- 创建一个
UTF-8
编码的Policy。 - 将Policy进行
base64
编码,其值即为Policy表单域该填入的值,并将该值作为将要签名的字符串。 - 使用
AccessKeySecret
对要签名的字符串进行签名,先用hmac-sha1哈希,再base64编码,签名方法与Header签名的方法相同,如下所示。
Signature = base64(hmac-sha1(AccessKeySecret, base64(policy)))
计算出的签名在表单域Signature中指定,如下所示。
Content-Disposition: form-data; name="Signature" {signature} --9431149156168
- 创建一个
- 如果您还有疑问,请参考示例代码:
PostObject简介
PostObject用于通过HTML表单上传的方式将文件(Object)上传至指定存储空间(Bucket)。PostObject的消息实体通过多重表单格式(multipart/form-data)编码,在PutObject操作中参数通过HTTP请求头传递,在PostObject操作中则作为消息体中的表单域传递。详细说明请参见RFC 2388。PostObject消息包括消息头(Header)和消息体(Body)。Header和Body之间由\r\n--{boundary}
分割。Body由一系列的表单域构成,表单域格式如下所示。
Content-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n--{boundary}
常见的Header有Host、User-Agent、Content-Length、Content-Type、Content-MD5等,表单域字段有Key、OSSAccessKeyId、Signature、Content-Disposition、object meta(x-oss-meta-*)、x-oss-security-token、其它HTTP Header(Cache-Control、Content-Type、Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires、Content-Encoding、Expires)、file等。表单域中file
必须是最后一个域。更多关于PostObject的介绍请参见PostObject。
相关文档
适用于
- 对象存储OSS