OSS PostObject错误及排查

PostObject简介

PostObject使用表单上传文件到OSS。PostObject的消息实体通过 多重表单格式multipart/form-data 编码,详细说明请参看 RFC 2388。Put Object中参数通过HTTP请求头传递,Post Object参数则作为消息体的表单域传递。

Post Object消息包括消息头(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必须是最后一个。

更多详细的介绍请参看 Post Object 。

PostObject常见错误

PostObject常见错误见下表:

序号 错误 原因 解法
1 ErrorCode: MalformedPOSTRequest
ErrorMessage: The body of your POST request is not well-formed multipart/form-data
表单域格式不符合要求 表单域格式请参看表后的PutObject表单域格式
2 ErrorCode: InvalidAccessKeyId
ErrorMessage: The OSS Access Key Id you provided does not exist in our records.
AccessKeyID禁用或不存在,或者过期的临时用户AccessKeyID,或者临时用户没有提供STS Token 排查方法请参看 InvalidAccessKeyId错误排查
3 ErrorCode: AccessDenied
ErrorMessage: Invalid according to Policy: Policy expired.
表单域policy中的expiration过期 请调整policy中的expiration,注意expiration的格式 ISO8601 GMT
4 ErrorCode: AccessDenied
ErrorMessage: SignatureDoesNotMatch The request signature we calculated does not match the signature you provided. Check your key and signing method.
签名错误 签名方法请参看下面的PutObject中的签名
5 ErrorCode: InvalidPolicyDocument
ErrorMessage: Invalid Policy: Invalid Simple-Condition: Simple-Conditions must have exactly one property specified.
请求中policy至少包含一个condition 请参看表后的 PutObject中的Policy格式
6 ErrorCode: InvalidPolicyDocument
ErrorMessage: Invalid Policy: Invalid JSON: unknown char e
请求中的policy格式不正确 请检查policy格式,"是否加缺失,转义字符是否加\
7 ErrorCode: InvalidPolicyDocument
ErrorMessage: Invalid Policy: Invalid JSON: , or ] expected
请求中的policy格式不正确 policy中是否缺少 ,]
8 ErrorCode: AccessDenied
ErrorMessage: Invalid according to Policy: Policy Condition failed: ["starts-with", "$key", "user/eric/"]
请求指定的keypolicy限定的不符 请检查请求中表单域key的值
9 ErrorCode: AccessDenied
ErrorMessage: Invalid according to Policy: Policy Condition failed: ["eq", "$bucket", "mingdi-bjx"]
请求指定bucketpolicy限定的不符 请检查endpoint中的bucket的值
10 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的值
11 ErrorCode: AccessDenied
ErrorMessage: Invalid according to Policy: Policy Condition failed: ["eq", "${field}", "${value}"]
表单域中指定的{field}与policy中限定的值不符,或者在请求中没有指定 请检查请求中的{field}的值
12 ErrorCode: AccessDenied
ErrorMessage: You have no right to access this object because of bucket acl.
当前用户无权限 请参看 OSS权限问题及排查
13 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或调整顺序

PutObject表单域格式

PutObject请求格式,有以下注意点:

  • 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}
  • 表单域 file 必须为最后一个表单域;
  • 表单域名称大小写敏感,如policy、key、file、OSSAccessKeyId、OSSAccessKeyId、Content-Disposition;
  • bucket为 public-read-write 时,可以不指定表单域OSSAccessKeyId、policy、Signature;一旦指定OSSAccessKeyId、policy、 Signature中的任意一个,无论bucket是否为public-read-write,则另两个必须指定。

下面是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"

2NeLj2Eb

提示:

  • 上面示例请求中\r\n显示为新行,即换行,后面的示例请求类似;
  • 上面的示例为请求的部分内容,完整的请求请参看 Post Object 。

如果您还有疑问,请参考示例代码: 
C#  
Java  
JS  

PutObject的Policy格式

PutObject请求的 policy 表单域用于验证请求的合法性,声明了PutObject请求必须满足的条件。限定条件为 UTF-8格式的Json文本,经过base64编码后放在表单域policy中Policy中必须包含expiration和condtions,其中condtions至少有一项。下面是base64编码前的policy示例:

{
    "expiration": "2018-01-01T12:00:00.000Z",
    "conditions": [
        ["content-length-range", 0, 104857600]
    ]
}

expiration项指定了请求的过期时间, ISO8601 GMT 时间格式;如 2018-01-01T12:00:00.000Z指定请求必须发生在2018年1月1日12点前。

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 。

PutObject的签名

对于验证的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

如果您还有疑问,请参考示例代码: 
C#   Java  
JS  

常见问题

怎么指定key

key即object name,在表单域key中指定,示例如下:

Content-Disposition: form-data; name="key"

{key}
--9431149156168

怎么指定object内容

object内容通过表单域file中指定,示例如下

Content-Disposition: form-data; name="file"; filename="images.png"
Content-Type: image/png

{file-content}
--9431149156168

注意:

  • 表单域file必须是表单中的最后一个域,即表单域file必须放在所有表单域后
  • filename是上传的本地文件名称,而不是object name。

怎么指定object类型content-type

object类型在表单域file中指定Content-Type,而不是Header中的Content-Type,示例如下:

Content-Disposition: form-data; name="file"; filename="images.png"
Content-Type: image/png

{file-content}
--9431149156168

怎么指定object内容md5校验content-md5

在PostObject请求头中指定Content-MD5,注意MD5值是整个body的MD5,即所有表单域的MD5。请求Header示例如下:

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

签名的计算方法请参看 PutObject中的签名 , 签名通过表单域 Signature 携带。

怎么使用临时用户STS Token执行PostOject

临时用户密钥的AccessKeyID、AccessKeySecret用法跟主用户、子用户相同,Token放在表单域 x-oss-security-token 中携带。示例如下:

Content-Disposition: form-data; name="Signature"

5L0+KaeugxYygfqWLJLoy0ehOmA=
--9431149156168
Content-Disposition: form-data; name="x-oss-security-token"

{Token}
--9431149156168

提示:

  • 您想了解更多访问控制的信息,请参看 阿里云访问控制 。

怎么指定上传回调(callback)

上传回调(callback)通过表单域callback携带。示例如下:

Content-Disposition: form-data; name="callback"

eyJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJjYWxsYmFja0JvZHkiOiAiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vb3NzLWRlbW8uYWxpeXVuY3MuY29tOjIzNDUwIn0=

callback的自定义参数也是通过表单域携带。示例如下:

--9431149156168
Content-Disposition: form-data; name="x:var1"

{var1-value}

提示:

  • 您想了解更多callback,请参看 上传回调 。

怎么指定Content-Transfer-Encoding

在表单域file中指定Content-Transfer-Encodingfile表单域示例如下:

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 指定,详细的说明请参看上面的 PutObject中的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操作:bucket 必须是 md-hzkey 必须以md/conf/ 开头,是上传的文件长度必须在100M以下;且请求时间在 2018-01-01T12:00:00.000Z之前。

怎么指定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示例

C# Post Demo

Java Post Demo

Js Post Demo

常用链接

Post Object  https://help.aliyun.com/document_detail/31988.html

Java PostObject实现  

时间: 2024-10-31 08:52:32

OSS PostObject错误及排查的相关文章

OSS的错误响应

  OSS的错误响应 当用户访问OSS出现错误时,OSS会返回给用户相应的错误码和错误信息,便于用户定位问题,并做出适当的处理. OSS的错误响应格式 当用户访问OSS出错时,OSS会返回给用户一个合适的3xx,4xx或者5xx的HTTP状态码;以及一个application/xml格式的消息体. 错误响应的消息体例子: AccessDeniedQuery-string authentication requires the Signature,Expires and OSSAccessKeyI

UCenter Home会员升级或搬家后404错误的排查方法

UCenter Home是http://www.aliyun.com/zixun/aggregation/12899.html">康盛创想(Comsenz)公司发布的一款SNS建站系统,自发布至今国内采用UCenter Home搭建的地方及垂直SNS已经超过15万家.本期教程就为大家解析会员升级或者搬家后再登录或者退出 UCenter Home 的时候有404的错误的排查方法,如下图所示 问题分析: 这个一般是由于 UCenter Home 的 config.php 文件中 UCenter

ECS API中Signature错误的排查方法

Signature的生成方法 将get中提交的参数(除了aks以外所有的参数)按照一定的组成规则拼成一个字符串,前面再加上GET&/&组成StringToSign,然后对StringToSign做 HMAC计算,以Access Key Secret+一个"&"号为HMAC计算的key,最终算出的字符串就是Signature. 排查思路 若碰到反馈Signature错误,可以排查以下几点: 1. 在构造"StringToSign"时是否对key

"朕亦甚想你"——从后宫管理看阿里云访问控制(下)

相关文章:"朕亦甚想你"--从后宫管理看阿里云访问控制(上) 授权策略管理   控制台上,授权策略管理界面,如下图所示.   系统授权策略,阿里云提供的一组通用授权策略,主要针对不同产品的只读权限.所有权限.对于阿里云提供的这组授权策略,用户只能用于授权,不能编辑和修改.更详细的解释,请参看 系统授权策略.   有4个重要的系统授权策略您需要了解,应该会使用到它们. 系统授权策略 说明 备注 AdministratorAccess 管理所有阿里云资源的权限 用户下所有阿里云服务的所有权

nginx 502 Bad Gateway 错误解决办法

 一些运行在Nginx上的网站有时候会出现"502 Bad Gateway"错误,有些时候甚至频繁的出现.以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考: Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的.这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推

Linux中MySQL主从复制中出现1593错误码的低级错误

今天测试shell脚本自动配置MySQL主从集群的时候发现从机一直1593错误,排查了半天发现是从的配置文件中的server-id没改导致,此低级错误记录下警醒自己. [root@DS-CentOS70 ~]# mysql -uroot -pYWFlMDAyZmFjOWJi Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor.  Commands

OSS常用工具汇总

  OSS除了控制台还有以下常用工具,可以帮助您更高效的使用OSS. 工具 简介 备注 OSS控制台客户端(驻云) 图像化界面工具,提供基本的Bucket管理功能.较为完备的Object管理功能. 官方推荐工具.支持win.mac平台. OSSUTIL 命令行管理工具.提供方便.简洁.丰富的Object管理命令. 官方工具,支持linux, windows, mac平台,不依赖于任何第三方组件,下载后即用不需要安装. osscmd 命令行管理工具.提供完备的Bucket.object管理命令.

Nginx 502错误触发条件与解决办法汇总

Nginx 502错误触发条件与解决办法汇总 一些运行在Nginx上的网站有时候会出现"502 Bad Gateway"错误,有些时候甚至频繁的出现.有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但事实上这是个误区. 以下是从张宴和Ayou的博客搜集整理的一些Nginx 502错误的排查方法,供大家参考: Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的.这些错误一般都不是nginx本身的问题,一定要从后端找

Nginx 502 bad gateway和Nginx 504 Gateway Time-out错误解决方法 错误解决办法_nginx

最近服务器宕机的现象比较频繁,临下班时分,G给挂掉了,502 Bad Gateway Nginx,不由得让我想起之前的504 Gateway Time-out,两者应该有点联系,一定得弄清楚.Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-o