对象 API
本章介绍对象相关的接口
PUT Object
上传一个对象到桶中,如果已有则覆盖。当开启了版本控制,同一个名称的对象可以在系统中保留多个版本,系统会为每次上传的对象生成一个version ID并保留每个版本。
请求语法
PUT /bucketname/ObjectName HTTP/1.1
Host: ip:port
Date: date
Authorization: authorization string
请求头部
--Cache-Control
指定请求/响应链中的缓存属性。
--Content-Disposition
当获取对象时,该属性提示将对象保存为的文件名。
--Content-Encoding
对象的附加编码类型,例如压缩文档使用的gzip类型。
--Content-MD5
对象内容(不包含头部)的MD5值经过BASE64编码后的字符串,服务端收到对象后也会做同样的计算,比较Content-MD5和服务端计算得出的结果,可以防止上传的对象内容被篡改或不完整。
--Content-Type
请求内容的MIME类型。
--Expect
当expect设置为100-continue,发送put object的请求时并不立刻发送对象内容,而是等收到100临时响应或等待超时再发送。
--Expires
缓存的超时时间。
--x-amz-meta-*
自定义元数据
结果解析
响应信息通过header返回。
--ETag
对象内容的MD5值转换为16进制之后生成的字符串。
--x-amz-version-id
版本号,当版本控制状态为Enabled,该字段返回此次上传对象的版本号,当版本控制状态为Suspended,该字段返回“null”,当未开启或禁用版本控制,该字段不返回。
样例
上传一个对象。
PUT /bucketname/my-image.jpg HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:50:00 GMT
Authorization: authorization string
Content-Type: text/plain
Content-Length: 11434
Expect: 100-continue
[11434 bytes of object data]
响应结果
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 17:50:00 GMT
ETag: "1b2cf535f27731c974343645a3985328"
Content-Length: 0
PUT Object - Copy
从系统中已有的对象拷贝到目标对象,不需要从本地上传对象内容。
请求语法
PUT /destinationbucket/destinationObject HTTP/1.1
Host: ip:port
x-amz-copy-source: /source_bucket/sourceObject
x-amz-metadata-directive: metadata_directive
x-amz-copy-source-if-match: etag
x-amz-copy-source-if-none-match: etag
x-amz-copy-source-if-unmodified-since: time_stamp
x-amz-copy-source-if-modified-since: time_stamp
<request metadata>
Authorization: authorization string
请求头部
--x-amz-copy-source
必须携带的头部。
复制对象的源对象地址,包含源存储桶和源对象,例如:/source_bucket/sourceObject ,默认复制源对象的最新版本,如果要指定版本复制,则需要增加版本号,例如:/source_bucket/sourceObject?versionId=3344 。
--x-amz-metadata-directive
指定是否从源对象复制元数据到目标对象。当指定为COPY时,从源对象复制元数据到目标对象,当指定为REPLACE时,源对象的元数据都不会复制到目标对象,目标对象使用复制对象请求中携带的元数据。
取值:COPY|REPLACE
默认值:COPY
--x-amz-copy-if-modified-since
时间,只有当源对象的创建时间在此时间后才进行复制。
--x-amz-copy-if-unmodified-since
时间,只有当源对象的创建时间在此之前才进行复制。
--x-amz-copy-if-match
ETag,只有当源对象的ETag与此ETag匹配才进行复制。
--x-amz-copy-if-none-match
ETag,只有当源对象的ETag与此ETag不匹配才进行复制。
--Cache-Control
指定请求/响应链中的缓存属性。
--Content-Disposition
当获取对象时,该属性提示将对象保存为的文件名。
--Content-Encoding
对象的附加编码类型,例如压缩文档使用的gzip类型。
--Content-MD5
对象内容(不包含头部)计算MD5值后经过BASE64编码后的字符串,服务端收到对象后也会做同样的计算,比较Content-MD5和服务端计算得出的结果是否一致,可以防止上传的对象内容被篡改或不完整。
--Expires
缓存的超时时间。
--x-amz-meta-*
自定义元数据
结果解析
版本号在响应header中体现。
--x-amz-version-id
复制后生成对象的版本号。
--x-amz-copy-source-version-id
源对象的版本号。
复制后对象的ETag和创建时间在消息体中以XML形式体现。
--CopyObjectResult
容器,包含ETag和LastModified。
--ETag
新对象内容计算MD5值后转换为16进制得到的字符串,与源对象一致。
--LastModified
新对象的创建时间。
样例
复制指定的版本。
PUT /bucketname/my-second-image.jpg HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:50:00 GMT
x-amz-copy-source: /bucketname/my-image.jpg?versionId=3344
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
x-amz-version-id:5656
x-amz-copy-source-version-id:3344
Date: Sat, 17 Aug 2019 17:50:00 GMT
<CopyObjectResult>
<LastModified>2019-08-17T17:50:00</LastModified>
<ETag>"9b2cf535f27731c974343645a3985328"</ETag>
</CopyObjectResult>
GET Object
获取对象内容。
请求语法
GET /bucketname/ObjectName HTTP/1.1
Host: ip:port
Date: date
Authorization: authorization string
请求参数
通过URL参数指定请求参数。
--versionId
获取指定版本的对象时通过此参数指定版本号。
--response-content-type
指定响应消息中的Content-Type头部值。
--response-content-language
指定响应消息中的Content-Language头部值。
--response-expires
指定响应消息中的Expires头部值。
--response-cache-control
指定响应消息中的Cache-Control头部值。
--response-content-disposition
指定响应消息中的Content-Disposition头部值。
--response-content-encoding
指定响应消息中的Content-Encoding头部值。
请求头部
--Range
下载指定位置的字节数。
--If-Modified-Since
指定时间,只有在指定时间之后更新过,才返回对象,否则返回304.
--If-Unmodified-Since
指定时间,只有在指定时间之前未更新,才返回对象,否则返回412.
--If-Match
指定ETag,只有对象的ETag和ETag匹配,才返回对象,否则返回412.
--If-None-Match
指定ETag,只有对象的ETag和ETag不匹配,才返回对象,否则返回304.
结果解析
响应信息通过header返回。
--x-amz-version-id
获取的对象的版本号。
--x-amz-meta-*
对象的自定义元数据,与上传对象时的设置一致。
--x-amz-delete-marker
当获取的对象是一个删除标记,响应中会携带该头部且值为true,当获取的对象不是删除标记,该头部不会携带。
样例
样例1:获取一个对象
GET /bucketname/ObjectName HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:50:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 17:50:00 GMT
Last-Modified: Sat, 17 Aug 2019 17:40:00 GMT
ETag: "fba9dede5f27731c9771645a39863328"
Content-Length: 434234
[434234 bytes of object data]
样例2:指定版本号获取一个对象
GET /bucketname/myObject?versionId=4433 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:50:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 17:50:00 GMT
Last-Modified: Sat, 17 Aug 2019 17:40:00 GMT
x-amz-version-id: 4433
ETag: "fba9dede5f27731c9771645a39863328"
Content-Length: 434234
Content-Type: text/plain
[434234 bytes of object data]
HEAD Object
获取对象的元数据信息,不获取对象内容。
请求语法
HEAD /bucketname/ObjectName HTTP/1.1
Host: ip:port
Authorization: authorization string
请求参数
通过URL参数指定请求参数。
--versionId
获取指定版本的对象时通过此参数指定版本号。
请求头部
--Range
下载指定位置的字节数。
--If-Modified-Since
指定时间,只有在指定时间之后更新过,才返回对象,否则返回304.
--If-Unmodified-Since
指定时间,只有在指定时间之前未更新,才返回对象,否则返回412.
--If-Match
指定ETag,只有对象的ETag和ETag匹配,才返回对象,否则返回412.
--If-None-Match
指定ETag,只有对象的ETag和ETag不匹配,才返回对象,否则返回304.
结果解析
响应信息通过header返回。
--x-amz-version-id
获取的对象的版本号。
--x-amz-meta-*
对象的自定义元数据,与上传对象时的设置一致。
样例
样例1:获取对象的元数据
HEAD /bucketname/my-image.jpg HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:50:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
x-amz-version-id: 3344
Date: Sat, 17 Aug 2019 17:50:00 GMT
Last-Modified: Sat, 17 Aug 2019 17:40:00 GMT
ETag: "fba9dede5f27731c9771645a39863328"
Content-Length: 434234
Content-Type: text/plain
样例2:获取指定版本对象的元数据
HEAD /bucketname/my-image.jpg?versionId=3344 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:55:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
x-amz-version-id: 3344
Date: Sat, 17 Aug 2019 17:55:00 GMT
Last-Modified: Sat, 17 Aug 2019 17:40:00 GMT
ETag: "fba9dede5f27731c9771645a39863328"
Content-Length: 434234
Content-Type: text/plain
DELETE Object
删除对象。
当打开了版本控制,删除对象实际会生成一个删除标记,原来的对象还保存在系统中。
当指定版本号删除时,找到对应的版本后会永久删除该版本。
请求语法
DELETE /bucketname/ObjectName HTTP/1.1
Host: ip:port
Date: date
Authorization: authorization string
请求参数
通过URL参数指定请求参数。
--versionId
删除指定版本的对象时通过此参数指定版本号。
结果解析
响应信息通过header返回。
--x-amz-delete-marker
当删除操作生成了一个删除标记,会返回该头部且值为true。
当指定版本号删除时,如果删除的是一个删除标记,会返回该头部且值为true。
--x-amz-version-id
当删除操作生成了一个删除标记,该头部记录删除标记的版本号。当指定版本删除对象时,该头部记录被删除的版本号。
样例
样例1:删除一个未开启版本控制的桶内的对象
DELETE /bucketname/my-second-image.jpg HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:55:00 GMT
Authorization: authorization string
Content-Type: text/plain
响应结果
HTTP/1.1 204 NoContent
Date: Sat, 17 Aug 2019 17:55:00 GMT
Content-Length: 0
样例2:删除指定版本对象
DELETE /bucketname/my-third-image.jpg?versionId=4455 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 17:58:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 204 NoContent
x-amz-version-id: 4455
Date: Sat, 17 Aug 2019 17:58:00 GMT
Content-Length: 0
Initiate Multipart Upload
初始化分段上传,获得upload ID。
请求语法
POST /bucketname/ObjectName?uploads HTTP/1.1
Host: ip:port
Date: date
Authorization: authorization string
请求头部
初始化时携带的元数据,在合并分段上传生成一个完整对象时作为对象的元数据。
--Cache-Control
指定请求/响应链中的缓存属性。
--Content-Disposition
当获取对象时,该属性提示将对象保存为的文件名。
--Content-Encoding
对象的附加编码类型,例如压缩文档使用的gzip类型。
--Content-Type
请求内容的MIME类型。
--Expires
缓存的超时时间。
--x-amz-meta-*
自定义元数据
结果解析
响应消息体中返回XML形式的结果,包含upload ID。
--InitiateMultipartUploadResult
容器,包含初始化分段的结果。
--Bucket
初始化分段上传对象所在存储桶。
--Key
初始化分段上传的对象名称。
--UploadId
初始化分段上传的ID,用来唯一标识一个分段上传请求。
样例
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 17:59:00 GMT
Content-Length: 151
<InitiateMultipartUploadResult>
<Bucket>bucketname</Bucket>
<Key>ObjectName</Key>
<UploadId>56778</UploadId>
</InitiateMultipartUploadResult>
Upload Part
上传分段。
请求语法
PUT /bucketname/ObjectName?partNumber=PartNumber&uploadId=UploadId HTTP/1.1
Host: ip:port
Date: date
Content-Length: Size
Authorization: authorization string
请求参数
--partNumber
分段编号,有效范围:1-10000
--uploadId
upload ID,在Initiate Multipart Upload获得。
样例
上传一个分段
PUT /bucketname/ObjectName?partNumber=1&uploadId=56778 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 18:05:00 GMT
Content-Length: 10485760
Content-MD5: pUNXr/BjKK5G2UKvaRRrOA==
Authorization: authorization string
***part data omitted***
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 18:05:00 GMT
ETag: "b54357faf0632cce46e942fa68356b38"
Content-Length: 0
List Parts
查询分段列表。
请求语法
GET /bucketname/ObjectName?uploadId=UploadId HTTP/1.1
Host: ip:port
Date: Date
Authorization: authorization string
请求参数
--uploadId
upload ID,在Initiate Multipart Upload获得。
--max-parts
一次返回的最大分段数。
--part-number-marker
查询的起始位置。
--encoding-type
响应结果编码类型,只支持url。由于对象名称可以包含任意字符,但是XML对某些特别的字符无法解析,所以需要对响应中的对象名称进行编码。
结果解析
在消息体中以XML形式返回查询结果。
--ListPartsResult
--Bucket
分段上传的存储桶名称。
--Key
分段上传的对象名称。
--UploadId
分段上传请求的upload ID。
--Initiator
分段上传的发起者。
--Owner
存储桶的拥有者。
--DisplayName
用户的名称。
--ID
用户的ID。
--PartNumberMarker
查询的part-number-marker条件。
--MaxParts
查询的max-parts条件。
--IsTruncated
是否被截断。
--NextPartNumberMarker
当IsTruncated为true时,该字段记录下一次查询的起始位置。
--Encoding-Type
查询的encoding-type条件。
--Part
容器,包含分段内容。
--PartNumber
分段编号。
--LastModified
分段的最新修改时间。
--ETag
分段的ETag。
--Size
分段的大小。
样例
查询upload ID为56778的分段列表,指定max-parts为2,part-number-marker为1。
GET /bucketname/ObjectName?uploadId=56778&max-parts=2&part-number-marker=1 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 18:10:00 GMT
Authorization: authorization string
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 18:10:00 GMT
Content-Length: 838
<ListPartsResult>
<Bucket>bucketname</Bucket>
<Key>ObjectName</Key>
<UploadId>56778</UploadId>
<Initiator>
<DisplayName>username</DisplayName>
<ID>34455</ID>
</Initiator>
<Owner>
<DisplayName>username</DisplayName>
<ID>34455</ID>
</Owner>
<PartNumberMarker>1</PartNumberMarker>
<NextPartNumberMarker>3</NextPartNumberMarker>
<MaxParts>2</MaxParts>
<IsTruncated>true</IsTruncated>
<Part>
<PartNumber>2</PartNumber>
<LastModified>2019-08-1T17:06:06.000Z</LastModified>
<ETag>"7778aef83f66abc1fa1e8477f296d394"</ETag>
<Size>10485760</Size>
</Part>
<Part>
<PartNumber>3</PartNumber>
<LastModified>2019-08-1T17:06:23.000Z</LastModified>
<ETag>"aaaa18db4cc2f85cedef654fccc4a4x8"</ETag>
<Size>10485760</Size>
</Part>
</ListPartsResult>
Complete Multipart Upload
完成分段上传,合并分段。
请求语法
POST /bucketname/ObjectName?uploadId=UploadId HTTP/1.1
Host: ip:port
Date: Date
Content-Length: Size
Authorization: authorization string
<CompleteMultipartUpload>
<Part>
<PartNumber>PartNumber</PartNumber>
<ETag>ETag</ETag>
</Part>
...
</CompleteMultipartUpload>
请求元素
--CompleteMultipartUpload
包含所有要合并的的分段信息
--Part
一个分段
--PartNumber
分段编码
--ETag
分段的ETag
结果解析
响应消息体中包含XML形式的合并结果,包含合并后对象的ETag。
--CompleteMultipartUploadResult
合并分段结果。
--Location
合并后对象的地址
--Bucket
存储桶名称
--Key
对象名称
--ETag
合并后对象的ETag,不一定是合并后完整对象的MD5值。
样例
POST /bucketname/ObjectName?uploadId=56778 HTTP/1.1
Host: ip:port
Date: Sat, 17 Aug 2019 18:10:30 GMT
Content-Length: 391
Authorization: authorization string
<CompleteMultipartUpload>
<Part>
<PartNumber>1</PartNumber>
<ETag>"a54357aff0632cce46d942af68356b38"</ETag>
</Part>
<Part>
<PartNumber>2</PartNumber>
<ETag>"0c78aef83f66abc1fa1e8477f296d394"</ETag>
</Part>
<Part>
<PartNumber>3</PartNumber>
<ETag>"acbd18db4cc2f85cedef654fccc4a4d8"</ETag>
</Part>
</CompleteMultipartUpload>
响应结果
HTTP/1.1 200 OK
Date: Sat, 17 Aug 2019 18:10:30 GMT
<CompleteMultipartUploadResult>
<Location>http://ip:port/bucketname/ObjectName</Location>
<Bucket>bucketname</Bucket>
<Key>ObjectName</Key>
<ETag>"3858f62230ac3c915f300c664312c11f-9"</ETag>
</CompleteMultipartUploadResult>
Abort Multipart Upload
取消分段上传。
请求语法
DELETE /bucketname/ObjectName?uploadId=UploadId HTTP/1.1
Host: ip:port
Date: Date
Authorization: authorization string
请求参数
--uploadId
待取消的upload ID。
样例
响应结果
HTTP/1.1 204 OK
Date: Sat, 17 Aug 2019 18:15:30 GMT
Content-Length: 0