阿里云OSS PostObject错误及排查详细版本

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: PostObject使用表单上传文件到OSS。PostObject的消息实体通过 多重表单格式multipart/form-data 编码,详细说明请参看 RFC 2388。Put Object中参数通过HTTP请求头传递,Post Object参数则作为消息体的表单域传递。

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"
2NeL********j2Eb

提示:

上面示例请求中\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-Encoding。file表单域示例如下:


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-hz,key 必须以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

常用链接

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
4月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
|
5月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
存储 运维 安全
阿里云OSS的优势
【7月更文挑战第19天】阿里云OSS的优势
230 2
|
5月前
|
存储 API 开发工具
阿里云OSS
【7月更文挑战第19天】阿里云OSS
199 1
|
5月前
|
存储 弹性计算 对象存储
预留空间是什么?阿里云OSS对象存储预留空间说明
阿里云OSS预留空间是预付费存储产品,提供折扣价以锁定特定容量,适用于抵扣有地域属性的Bucket标准存储费用及ECS快照费。通过购买预留空间,如500GB通用预留+100GB标准-本地冗余存储包,用户可优化成本。
222 4
|
5月前
|
人工智能 对象存储
【阿里云AI助理】自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
134 1
|
6月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何将CSV文件从阿里云OSS同步到ODPS表,并且使用列作为表分区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
DataWorks产品使用合集之如何将CSV文件从阿里云OSS同步到ODPS表,并且使用列作为表分区
|
7月前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56606 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用