全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS

PutObject

更新时间:2017-08-14 17:01:04

Put Object

Put Object用于上传文件。

请求语法

  1. PUT /ObjectName HTTP/1.1
  2. Content-LengthContentLength
  3. Content-Type: ContentType
  4. Host: BucketName.oss-cn-hangzhou.aliyuncs.com
  5. Date: GMT Date
  6. Authorization: SignatureValue

请求Header

名称 描述
Cache-Control 指定该Object被下载时的网页的缓存行为;更详细描述请参照RFC2616
类型:字符串
默认值:无
Content-Disposition 指定该Object被下载时的名称;更详细描述请参照RFC2616
类型:字符串
默认值:无
Content-Encoding 指定该Object被下载时的内容编码格式;更详细描述请参照RFC2616
类型:字符串
默认值:无
Content-MD5 根据协议RFC 1864对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码为一个消息的Content-MD5值。该请求头可用于消息合法性的检查(消息内容是否与发送时一致)。虽然该请求头是可选项,OSS建议用户使用该请求头进行端到端检查。
类型:字符串
默认值:无
限制:无
Expires 过期时间;更详细描述请参照RFC2616
类型:字符串
默认值:无
注意:OSS不会对这个值进行限制和验证
x-oss-server-side-encryption 指定oss创建object时的服务器端加密编码算法。
类型:字符串
合法值:AES256
x-oss-object-acl 指定oss创建object时的访问权限。
类型:字符串
合法值:public-read,private,public-read-write

细节分析

  1. 如果用户上传了Content-MD5请求头,OSS会计算body的Content-MD5并检查一致性,如果不一致,将返回InvalidDigest错误码。
  2. 如果请求头中的“Content-Length”值小于实际请求体(body)中传输的数据长度,OSS仍将成功创建文件;但Object大小只等于“Content-Length”中定义的大小,其他数据将被丢弃。
  3. 如果试图添加的Object的同名文件已经存在,并且有访问权限。新添加的文件将覆盖原来的文件,成功返回200 OK。
  4. 如果在PutObject的时候,携带以x-oss-meta-为前缀的参数,则视为user meta,比如x-oss-meta-location。一个Object可以有多个类似的参数,但所有的user meta总大小不能超过8k。
  5. 如果Head中没有加入Content length参数,会返回411 Length Required错误。错误码:MissingContentLength。
  6. 如果设定了长度,但是没有发送消息Body,或者发送的body大小小于给定大小,服务器会一直等待,直到time out,返回400 Bad Request消息。错误码:RequestTimeout。
  7. 如果试图添加的Object所在的Bucket不存在,返回404 Not Found错误。错误码:NoSuchBucket。
  8. 如果试图添加的Object所在的Bucket没有访问权限,返回403 Forbidden错误。错误码:AccessDenied。
  9. 如果添加文件长度超过5G,返回错误消息400 Bad Request。错误码:InvalidArgument。
  10. 如果传入的Object key长度大于1023字节,返回400 Bad Request。错误码:InvalidObjectName。
  11. PUT一个Object的时候,OSS支持5个 HTTP RFC2616协议规定的Header 字段:Cache-Control、Expires、Content-Encoding、Content-Disposition、Content-Type。如果上传Object时设置了这些Header,则这个Object被下载时,相应的Header值会被自动设置成上传时的值。
  12. 如果上传Object时指定了x-oss-server-side-encryption Header,则必须设置其值为AES256,否则会返回400和相应错误提示:InvalidEncryptionAlgorithmError。指定该Header后,在响应头中也会返回该Header,OSS会对上传的Object进行加密编码存储,当这个Object被下载时,响应头中会包含x-oss-server-side-encryption,值被设置成该Object的加密算法。

常见问题

Content-MD5计算方式错误

以上传的内容为 0123456789 为例,计算这个字符串的Content-MD5。

1. 正确的计算方式

标准中定义的算法简单点说就是:

  1. 先计算出上传内容的MD5,其值是一个128位(128 bit)的二进制数组。
  2. 再对这个二进制数组进行base64编码。

以Python语言为例,正确计算的代码为:

  1. >>> import base64,hashlib
  2. >>> hash = hashlib.md5()
  3. >>> hash.update("0123456789")
  4. >>> base64.b64encode(hash.digest())
  5. 'eB5eJF1ptWaXm4bijSPyxw=='

需要注意的是,这里要用 hash.digest() 的结果作为base64编码的输入。

  1. >>> hash.digest()
  2. 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'

2. 错误的计算方式

常见的一个错误是对计算出的32字节(32 bytes)的 MD5字符串表示 进行base64编码。例如,错误的对 hash.hexdigest() 进行base64编码:

  1. >>> hash.hexdigest()
  2. '781e5e245d69b566979b86e28d23f2c7'
  3. >>>
  4. >>> # 下面是错误的计算结果
  5. >>> base64.b64encode(hash.hexdigest())
  6. 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='

3. 调查方法

可以用下述方法进行调查:

  1. 最终计算出来的Content-MD5是一个24字节的可见字符串
  2. 尝试用 0123456789 作为内容,确认Content-MD5是 eB5eJF1ptWaXm4bijSPyxw==

示例

请求示例:

  1. PUT /oss.jpg HTTP/1.1
  2. Host: oss-example.oss-cn-hangzhou.aliyuncs.com
  3. Cache-control: no-cache
  4. Expires: Fri, 28 Feb 2012 05:38:42 GMT
  5. Content-Encoding: utf-8
  6. Content-Disposition: attachment;filename=oss_download.jpg
  7. Date: Fri, 24 Feb 2012 06:03:28 GMT
  8. Content-Type: image/jpg
  9. Content-Length: 344606
  10. Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:kZoYNv66bsmc10+dcGKw5x2PRrk=
  11. [344606 bytes of object data]

返回示例:

  1. HTTP/1.1 200 OK
  2. Server: AliyunOSS
  3. Date: Sat, 21 Nov 2015 18:52:34 GMT
  4. Content-Length: 0
  5. Connection: keep-alive
  6. x-oss-request-id: 5650BD72207FB30443962F9A
  7. x-oss-bucket-version: 1418321259
  8. ETag: "A797938C31D59EDD08D86188F6D5B872"
本文导读目录