Dstor数据访问接口定义
TOC
一、支持的操作列表
二、公共请求头部
三、公共响应状态码
四、接口详细说明
1、关于Service的操作
2、关于bucket的操作
2.1、PUT Bucket
2.2、DELETE Bucket
2.3、HEAD Bucket
2.4、GET Bucket(List Object)
2.5、PUT Bucket Lifecycle
2.6、GET Bucket Lifecycle
2.7、DELETE Bucket Lifecycle
3、关于object的操作
3.1、PUT Object
3.2、HEAD Object
3.3、GET Object
3.4、DELETE Object
3.5、COPY Object
4、关于Multipart Upload的操作
4.1、Initiate Multipart Upload
4.2、Upload Part
4.3、Complete Multipart Upload
4.4、Abort Multipart Upload
4.5、List Parts
一、支持的操作列表
接口名称 |
接口说明 |
GET Service(List Bucket) |
列出一个用户下所有的bucket |
PUT Bucket |
创建bucket,只能是字母,数字,下划线组合的字符串 |
DELETE Bucket |
删除bucket,若bucket非空,需先删掉下面所有文件 |
Head Bucket |
获取bucket信息,也称作GET Bucket Info |
Get Bucket (List Object) |
列出一个用户下的对象,接口也称作GET Bucket |
PUT Bucket Lifecycle |
设置或替换一个bucket下的对象生命周期规则 |
GET Bucket Lifecycle |
获取一个bucket下的对象生命周期规则 |
DELETE Bucket Lifecycle |
删除一个bucket下的对象生命周期规则 |
PUT Object |
上传一个对象,对象名字符串支持utf8和gbk编码 |
Head Object |
获取对象信息,接口也称作Get Object Info |
GET Object |
获取一个对象,对象名字符串支持utf8和gbk编码 |
DELETE Object |
删除一个对象 |
Copy Object |
拷贝一个对象,不能保证原子性 |
Initiate Multipart Upload |
初始化一个Multipart Upload事件。该接口会返回一个Dstor创建的全局唯一的Upload ID |
Upload Part |
根据指定的Object名和Upload ID来分块(Part)上传数据 |
Complete Multipart Upload |
在将所有数据Part都上传完成后,必须调用此接口来完成整个文件的Multipart Upload |
Abort Multipart Upload |
根据用户提供的Upload ID中止其对应的Multipart Upload事件 |
List Parts |
罗列出指定Upload ID所属的所有已经上传成功Part |
GET_BUCKET_ACL |
这些接口实际未实现,仅为适配s3测试和客户端返回默认值 |
GET_BUCKET_OBJECT_VERSIONS |
|
GET_BUCKET_LOCATION |
|
GET_BUCKET_VERSIONING |
|
GET_OBJECT_ACL |
|
二、公共请求头部
Request Header |
Description |
CONTENT_LENGTH |
Length of the request body. |
DATE |
Request time and date (in UTC). |
HOST |
The name of the host server. |
AUTHORIZATION |
Authorization token. |
三、公共响应状态码
HTTP Status |
Response Code |
100 |
Continue |
200 |
Success |
201 |
Created |
202 |
Accepted |
204 |
NoContent |
206 |
Partial content |
304 |
NotModified |
400 |
InvalidArgument |
400 |
InvalidDigest |
400 |
BadDigest |
400 |
InvalidBucketName |
400 |
InvalidObjectName |
400 |
UnresolvableGrantByEmailAddress |
400 |
InvalidPart |
400 |
InvalidPartOrder |
400 |
RequestTimeout |
400 |
EntityTooLarge |
403 |
AccessDenied |
403 |
UserSuspended |
403 |
RequestTimeTooSkewed |
404 |
NoSuchKey |
404 |
NoSuchBucket |
404 |
NoSuchUpload |
405 |
MethodNotAllowed |
408 |
RequestTimeout |
409 |
BucketAlreadyExists |
409 |
BucketNotEmpty |
411 |
MissingContentLength |
412 |
PreconditionFailed |
416 |
InvalidRange |
422 |
UnprocessableEntity |
500 |
InternalError |
四、接口详细说明
1、关于Service的操作
1.1、GET Service
对于服务地址作Get请求可以返回请求者拥有的Bucket列表,其中“/”表示根目录。
1.1.1、请求语法
| GET / HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
1.1.2、请求参数
无
1.1.3、响应元素(Response Elements)
名称 |
描述 |
ListAllMyBucketsResult |
保存Get Service请求结果的容器。 类型:容器 子节点: Owner, Buckets 父节点:None |
Owner |
用于存放Bucket拥有者信息的容器。 类型:容器 父节点:ListAllMyBucketsResult |
ID |
Bucket拥有者的用户ID。 类型:字符串 父节点:ListAllMyBucketsResult.Owner |
DisplayName |
Bucket拥有者的名称 (目前和ID一致)。 类型:字符串 父节点:ListAllMyBucketsResult.Owner |
Buckets |
保存多个Bucket信息的容器。 类型:容器 子节点:Bucket 父节点:ListAllMyBucketsResult |
Bucket |
保存bucket信息的容器. 类型:容器 子节点:Name, CreationDate, Location 父节点:ListAllMyBucketsResult.Buckets |
Name |
Bucket名称。 类型:字符串 父节点:ListAllMyBucketsResult.Buckets.Bucket |
CreateDate |
Bucket创建时间 类型:时间 (格式:yyyy-mm-ddThh:mm:ss.timezone, e.g., 2011-12-01T12:27:13.000Z) 父节点:ListAllMyBucketsResult.Buckets.Bucket |
1.1.4、细节分析
- GetService这个API只对验证通过的用户有效。
- 如果请求中没有用户验证信息(即匿名访问),返回403 Forbidden。错误码:AccessDenied。
- 当所有的bucket都返回时,返回的xml中不包含Prefix、Marker、MaxKeys、IsTruncated、NextMarker节点,如果还有部分结果未返回,则增加上述节点,其中NextMarker用于继续查询时给marker赋值。
1.1.5、示例
请求示例Ⅰ
| GET / HTTP/1.1
Host: api.dstor.dnion.com
Date: Thu, 15 Mar 2017 11:18:32 GMT
Authorization: AWS nxj7dtl1c24jwhcyl5hpvnhi:COS3OQkfQPnKmYZTEHYv2qUl5jI=
|
返回示例Ⅰ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | HTTP/1.1 200 OK
Date: Thu, 15 Mar 2017 11:18:32 GMT
Content-Type: application/xml
Content-Length: 556
Connection: keep-alive
x-amz-request-id: tx00000000000000000027b-0057835f2e-107c-default
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult>
<Owner>
<ID>12345</ID>
<DisplayName>dnionstore</DisplayName>
</Owner>
<Buckets>
<Bucket>
<CreationDate>2016-12-17T18:12:43.000Z</CreationDate>
<Name>test-bucket1</Name>
</Bucket>
<Bucket>
<CreationDate>2016-12-25T11:21:04.000Z</CreationDate>
<Name>test-bucket2</Name>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
|
请求示例Ⅱ
| GET /?prefix=xz02tphky6fjfiuc&max-keys=1 HTTP/1.1
Host: api.dstor.dnion.com
Date: Thu, 15 Mar 2017 11:18:32 GMT
Authorization: AWS nxj7dtl1c24jwhcyl5hpvnhi:COS3OQkfQPnKmYZTEHYv2qUl5jI=
|
返回示例Ⅱ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | HTTP/1.1 200 OK
Date: Thu, 15 Mar 2017 11:18:32 GMT
Content-Type: application/xml
Content-Length: 545
Connection: keep-alive
x-amz-request-id: tx00000000000000000027b-0057835f2e-107d-default
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult>
<Prefix>xz02tphky6fjfiuc</Prefix>
<Marker></Marker>
<MaxKeys>1</MaxKeys>
<IsTruncated>true</IsTruncated>
<NextMarker>xz02tphky6fjfiuc0</NextMarker>
<Owner>
<ID>12345</ID>
<DisplayName>dnionstore</DisplayName>
</Owner>
<Buckets>
<Bucket>
<CreationDate>2016-05-15T11:18:32.000Z</CreationDate>
<Name>test-bucket1</Name>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
|
2、关于bucket的操作
2.1、PUT Bucket
PUT Bucket用于创建Bucket(不支持匿名访问)。
2.1.1、请求语法
| PUT /BucketName/ HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.1.2、细节分析
- 如果请求的Bucket已经存在,并且请求者是所有者,返回200 OK成功。
- 如果想创建的Bucket不符合命名规范,返回400 Bad Request消息。错误码:InvalidBucketName。
- 如果用户发起PUT Bucket请求的时候,没有传入用户验证信息,返回403 Forbidden消息。错误码:AccessDenied。
- 如果PutBucket的时候发现已经超过bucket最大创建数时,默认1000个,返回400 Bad Request消息。错误码:TooManyBuckets。
- 创建的Bucket,可以指定Bucket的存储类型,可选值为Standard。
2.1.3、示例
请求示例:
| PUT /test-bucket/ HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 03:15:40 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:77Dvh5wQgIjWjwO/KyRt8dOPfo8=
|
返回示例:
| HTTP/1.1 200 OK
x-amz-request-id: tx00000000000000000027b-0057835f2e-107b-default
Date: Fri, 24 Feb 2017 03:15:40 GMT
Content-Length: 0
Connection: keep-alive
|
2.2、DELETE Bucket
Delete Bucket用于删除某个Bucket。
2.2.1、请求语法
| DELETE /BucketName/ HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.2.2、细节分析
- 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
- 为了防止误删除的发生,Dstor不允许用户删除一个非空的Bucket。
- 如果试图删除一个不为空的Bucket,返回409 Conflict错误,错误码:BucketNotEmpty。
- 只有Bucket的拥有者才能删除这个Bucket。如果试图删除一个没有对应权限的Bucket,返回403 Forbidden错误。错误码:AccessDenied。
2.2.3、示例
请求示例:
| DELETE /test-bucket/ HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 05:31:04 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:ceOEyZavKY4QcjoUWYSpYbJ3naA=
|
返回示例:
| HTTP/1.1 204 No Content
x-amz-request-id: 534B371674E88A4D8906008B
Date: Fri, 24 Feb 2017 05:31:04 GMT
Connection: keep-alive
Content-Length: 0
|
2.3、HEAD Bucket
HEAD Bucket操作用于确认bucket是否存在以及客户端是否具有该bucket的访问权限。
2.3.1、请求语法
| HEAD /BucketName/ HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.3.2、细节分析
- 如果Bucket不存在,返回404错误。错误码:NoSuchBucket。
- 只有Bucket的拥有者才能查看Bucket的信息,否则返回403 Forbidden错误,错误码:AccessDenied。
2.3.3、示例
请求示例:
| HEAD /BucketName/ HTTP/1.1
Host: api.dstor.dnion.com
Date: Sat, 12 Sep 2015 07:51:28 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc: BuG4rRK+zNhH1AcF51NNHD39zXw=
|
成功获取Bucket信息的返回示例:
| HTTP/1.1 200
x-amz-request-id: 534B371674E88A4D8906008B
Date: Sat, 12 Sep 2015 07:51:28 GMT
Connection: keep-alive
Content-Length: 0
|
2.4、Get Bucket(List Object)
Get Bucket操作可用来list Bucket中所有Object的信息。
2.4.1、请求语法
| GET /bucketname/ HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.4.2、请求参数
GetBucket(ListObject)时,可以通过prefix,marker,delimiter和max-keys对list做限定,返回部分结果。
名称 |
描述 |
delimiter |
是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为公共前缀—CommonPrefixes。 数据类型:字符串 默认值:无 |
marker |
设定结果从marker之后按字母排序的第一个开始返回。 数据类型:字符串 默认值:无 |
max-keys |
限定此次返回object的最大数,如果不设定,默认为100,max-keys取值不能大于1000。 数据类型:字符串 默认值:100 |
prefix |
限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix。 数据类型:字符串 默认值:无 |
2.4.3、响应元素(Response Elements)
名称 |
描述 |
Contents |
保存每个返回Object meta的容器。 类型:容器 父节点:ListBucketResult |
CommonPrefixes |
如果请求中指定了delimiter参数,则在Dstor返回的响应中包含CommonPrefixes元素。该元素标明那些以delimiter结尾,并有共同前缀的object名称的集合。 类型:字符串 父节点:ListBucketResult |
Delimiter |
是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes,目前只支持斜杠”/”。 类型:字符串 父节点:ListBucketResult |
DisplayName |
Object 拥有者的名字。 类型:字符串 父节点:ListBucketResult.Contents.Owner |
ETag |
ETag (entity tag) 在每个Object生成的时候被创建,用于标示一个Object的内容。对于Put Object请求创建的Object,ETag值是其内容的MD5值;对于其他方式创建的Object,ETag值是其内容的UUID。ETag值可以用于检查Object内容是否发生变化。不建议用户使用ETag来作为Object内容的MD5校验数据完整性。 类型:字符串 父节点:ListBucketResult.Contents |
ID |
Bucket拥有者的用户ID。 类型:字符串 父节点:ListBucketResult.Contents.Owner |
IsTruncated |
指明是否所有的结果都已经返回; “true”表示本次没有返回全部结果;“false”表示本次已经返回了全部结果。 类型:枚举字符串 有效值:true、false 父节点:ListBucketResult |
Key |
Object的Key. 类型:字符串 父节点:ListBucketResult.Contents |
LastModified |
Object最后被修改的时间。 类型:时间 父节点:ListBucketResult.Contents |
ListBucketResult |
保存Get Bucket请求结果的容器. 类型:容器 子节点:Name, Prefix, Marker, MaxKeys, Delimiter, IsTruncated, Nextmarker, Contents 父节点:None |
Marker |
标明这次Get Bucket(List Object)的起点。 类型:字符串 父节点:ListBucketResult |
MaxKeys |
响应请求内返回结果的最大数目。 类型:字符串 父节点:ListBucketResult |
Name |
Bucket名字 类型:字符串 父节点:ListBucketResult |
Owner |
保存Bucket拥有者信息的容器。 类型:容器 子节点:DisplayName, ID 父节点:ListBucketResult |
Prefix |
本次查询结果的开始前缀。 类型:字符串 父节点:ListBucketResult |
Size |
Object的字节数。 类型:字符串 父节点:ListBucketResult.Contents |
StorageClass |
Object的存储类型,支持“Standard”、“IA”、“Archive”。(目前只有部分区域支持“Archive”类型) 类型:字符串 父节点:ListBucketResult.Contents |
2.4.4、细节分析
- 如果访问的Bucket不存在,包括试图访问因为命名不规范无法创建的Bucket,返回404 Not Found错误,错误码:NoSuchBucket。
- 如果没有访问该Bucket的权限,返回403 Forbidden错误,错误码:AccessDenied。
- 如果因为max-keys的设定无法一次完成listing,返回结果会附加一个,提示继续listing可以以此为marker。NextMarker中的值仍在list结果之中。
- 在做条件查询时,即使marker实际在列表中不存在,返回也从符合marker字母排序的下一个开始打印。如果max-keys小于0或者大于1000,将返回400 Bad Request错误。错误码:InvalidArgument。
- 若prefix,marker,delimiter参数不符合长度要求,返回400 Bad Request。错误码:InvalidArgument。
- prefix,marker用来实现分页显示效果,参数的长度必须小于1024字节。
- 如果把prefix设为某个文件夹名,就可以罗列以此prefix开头的文件,即该文件夹下递归的所有的文件和子文件夹。如果再把delimiter设置为 / 时,返回值就只罗列该文件夹下的文件,该文件夹下的子文件名返回在CommonPrefixes部分,子文件夹下递归的文件和文件夹不被显示。如一个bucket存在三个object :fun/test.jpg, fun/movie/001.avi, fun/movie/007.avi。若设定prefix为”fun/” ,则返回三个object;如果增加设定delimiter为“/”,则返回文件”fun/test.jpg”和前缀”fun/movie/”;即实现了文件夹的逻辑。
2.4.5、示例
在bucket“test-bucket”内有4个object,名字分别为:
test1.jpg
fun/test2.jpg
fun/movie/001.avi
fun/movie/007.avi
请求示例:
| GET /bucketname/ HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 08:43:27 GMT
Authorization: AWS 96786O1TF69Z0YB4I7O1:uI0ll22EgdycsVhCbFBxpHdHeOE=
|
返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 | HTTP/1.1 200 OK
x-awz-request-id: 534B371674E88A4D8906008B
Date: Fri, 24 Feb 2012 08:43:27 GMT
Content-Type: application/xml
Content-Length: 1866
Connection: keep-alive
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>bucketname</Name>
<Prefix></Prefix>
<Marker></Marker>
<MaxKeys>100</MaxKeys>
<Delimiter></Delimiter>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>fun/movie/001.avi</Key>
<LastModified>2012-02-24T08:43:07.000Z</LastModified>
<ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
<Type>Normal</Type>
<Size>344606</Size>
<StorageClass>Standard</StorageClass>
<Owner>
<ID>new_user7</ID>
<DisplayName>new_user7</DisplayName>
</Owner>
</Contents>
<Contents>
<Key>fun/movie/007.avi</Key>
<LastModified>2012-02-24T08:43:27.000Z</LastModified>
<ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
<Type>Normal</Type>
<Size>344606</Size>
<StorageClass>Standard</StorageClass>
<Owner>
<ID>new_user7</ID>
<DisplayName>new_user7</DisplayName>
</Owner>
</Contents>
<Contents>
<Key>fun/test2.jpg</Key>
<LastModified>2012-02-24T08:42:32.000Z</LastModified>
<ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
<Type>Normal</Type>
<Size>344606</Size>
<StorageClass>Standard</StorageClass>
<Owner>
<ID>new_user7</ID>
<DisplayName>new_user7</DisplayName>
</Owner>
</Contents>
<Contents>
<Key> test1.jpg</Key>
<LastModified>2012-02-24T06:07:48.000Z</LastModified>
<ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
<Type>Normal</Type>
<Size>344606</Size>
<StorageClass>Standard</StorageClass>
<Owner>
<ID>new_user7</ID>
<DisplayName>new_user7</DisplayName>
</Owner>
</Contents>
</ListBucketResult>
|
请求示例(含prefix和delimiter参数):
| GET /bucketname/?prefix=fun/&delimiter=/ HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2012 08:43:27 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:DNrnx7xHk3sgysx7I8U9I9IY1vY=
|
返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | HTTP/1.1 200 OK
x-awz-request-id: 534B371674E88A4D8906008B
Date: Fri, 24 Feb 2012 08:43:27 GMT
Content-Type: application/xml
Content-Length: 712
Connection: keep-alive
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/”>
<Name>bucketname</Name>
<Prefix>fun/</Prefix>
<Marker></Marker>
<MaxKeys>100</MaxKeys>
<Delimiter>/</Delimiter>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>fun/test2.jpg</Key>
<LastModified>2012-02-24T08:42:32.000Z</LastModified>
<ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
<Type>Normal</Type>
<Size>344606</Size>
<StorageClass>Standard</StorageClass>
<Owner>
<ID>new_user7</ID>
<DisplayName>new_user7</DisplayName>
</Owner>
</Contents>
<CommonPrefixes>
<Prefix>fun/movie/</Prefix>
</CommonPrefixes>
</ListBucketResult>
|
2.5、Put Bucket Lifecycle
Bucket的拥有者可以通过Put Bucket Lifecycle来设置Bucket的Lifecycle配置。Lifecycle开启后,Dstor将按照配置,定期自动删除或转储与Lifecycle规则相匹配的Object。
2.5.1、请求语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | PUT /bucketname/?lifecycle HTTP/1.1
Date: GMT Date
Content-Length:ContentLength
Content-Type: application/xml
Authorization: AWS AccessKeyId:SignatureValue
Host: api.dstor.dnion.com
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>RuleID</ID>
<Prefix>Prefix</Prefix>
<Status>Status</Status>
<Expiration>
<Days>Days</Days>
</Expiration>
</Rule>
</LifecycleConfiguration>
|
2.5.2、请求元素(Request Elements)
名称 |
描述 |
Days |
指定规则在对象最后修改时间过后多少天生效。 类型:正整数 父节点:Expiration |
Expiration |
指定Object规则的过期属性。 类型:容器 子节点:Days或CreatedBeforeDate 父节点:Rule |
ID |
规则唯一的ID。最多由255字节组成。当用户没有指定,或者该值为空时,Dstor会为用户生成一个唯一值。 类型:字符串 子节点:无 父节点:Rule |
LifecycleConfiguration |
Lifecycle配置的容器,最多可容纳1000条规则。 类型:容器 子节点:Rule 父节点:无 |
Prefix |
指定规则所适用的前缀。只有匹配前缀的对象才可能被该规则所影响。不可重叠。 类型:字符串 子节点:无 父节点:Rule |
Rule |
表述一条规则 类型:容器 子节点:ID,Prefix,Status,Expiration 父节点:LifecycleConfiguration |
Status |
如果其值为Enabled,那么Dstor会定期执行该规则;如果是Disabled,那么Dstor会忽略该规则。 类型:字符串 父节点:Rule 有效值:Enabled,Disabled |
2.5.3、细节分析
- 只有Bucket的拥有者才能发起Put Bucket Lifecycle请求,否则返回403 Forbidden消息。错误码:AccessDenied。
- 如果此前没有设置过Lifecycle,此操作会创建一个新的Lifecycle配置;否则,就覆写先前的配置。
- 对Object设置过期时间目前是以整天为单位,并且由于Dstor后台删除过期对象的时间并不是实时的,Object实际被删除的时间可能会比规则设置的时间要晚一天。
2.5.4、示例
请求示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | PUT /bucketname/?lifecycle HTTP/1.1
Host: api.dstor.dnion.com
Content-Length: 443
Date: Thu , 8 Jun 2017 13:08:38 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:PYbzsdWSMrAIWAlMW8luWekJ8=
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>delete objects after one day</ID>
<Prefix>logs/</Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>1</Days>
</Expiration>
</Rule>
<Rule>
<ID>objects expire after 10 years</ID>
<Prefix>data/</Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>3600</Days>
</Expiration>
</Rule>
</LifecycleConfiguration>
|
返回示例:
| HTTP/1.1 200 OK
x-amz-request-id: 534B371674E88A4D8906008B
Date: Thu , 8 Jun 2017 13:08:38 GMT
Content-Length: 0
Connection: keep-alive
|
2.6、Get Bucket Lifecycle
Get Bucket Lifecycle用于查看Bucket的Lifecycle配置。
2.6.1、请求语法
| GET /bucketname/?lifecycle HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.6.2、细节分析
- 只有Bucket的拥有者才能查看Bucket的Lifecycle配置,否则返回403 Forbidden错误,错误码:AccessDenied。
- 如果Bucket或Lifecycle不存在,返回404 Not Found错误,错误码:NoSuchBucket或NoSuchLifecycle。
2.6.3、示例
请求示例:
| Get /bucketname/?lifecycle HTTP/1.1
Host: api.dstor.dnion.com
Date: Mon, 14 Apr 2014 01:17:29 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:ceOEyZavKY4QcjoUWYSpYbJ3naA=
|
已设置Lifecycle的返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | HTTP/1.1 200
x-amz-request-id: 534B371674E88A4D8906008B
Date: Mon, 14 Apr 2014 01:17:29 GMT
Connection: keep-alive
Content-Length: 255
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>delete after one day</ID>
<Prefix>logs/</Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>1</Days>
</Expiration>
</Rule>
</LifecycleConfiguration>
|
未设置Lifecycle的返回示例:
| HTTP/1.1 404
x-amz-request-id: 534B371674E88A4D8906008B
Date: Mon, 14 Apr 2014 01:17:29 GMT
Connection: keep-alive
Content-Length: 0
|
2.7、Delete Bucket Lifecycle
通过Delete Bucket Lifecycle来删除指定Bucket的生命周期配置。
2.7.1、请求语法
| DELETE /bucketname/?lifecycle HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
2.7.2、细节分析
- 本操作会删除指定Bucket的所有的生命周期规则。此后,该Bucket中不会有Object被自动删除。
- 只有Bucket的拥有者才能删除Bucket的Lifecycle配置。如果试图操作一个不属于你的Bucket,Dstor返回403 Forbidden错误,错误码:AccessDenied。
2.7.3、示例
请求示例:
| DELETE /bucketname/?lifecycle HTTP/1.1
Host: api.dstor.dnion.com
Date: Mon, 14 Apr 2014 01:17:35 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:6ZVHOehYzxoC1yxRydPQs/CnMZU=
|
返回示例:
| HTTP/1.1 204 No Content
x-amz-request-id: 534B371674E88A4D8906008B
Date: Mon, 14 Apr 2014 01:17:35 GMT
Connection: keep-alive
Content-Length: 0
|
3、关于object的操作
3.1、PUT Object
PUT Object用于普通方式(另一种方式是分片上传)上传文件。
3.1.1、请求语法
| PUT /BucketName/ObjectName HTTP/1.1
Content-Length:ContentLength
Content-Type: ContentType
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
名称 |
描述 |
Content-MD5 |
根据协议RFC 1864对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码为一个消息的Content-MD5值。该请求头可用于消息合法性的检查(消息内容是否与发送时一致)。虽然该请求头是可选项,Dstor建议用户使用该请求头进行端到端检查。 类型:字符串 默认值:无 限制:无 |
Expires |
过期时间;更详细描述请参照RFC2616。 类型:字符串 默认值:无 注意:Dstor不会对这个值进行限制和验证 |
3.1.3、细节分析
3.1.4、Content-MD5计算规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | 以上传的内容为"123456789"来说,计算这个字符串的Content-MD5
正确的计算方式:
1. 先计算MD5加密的二进制数组(128位)。
2. 再对这个二进制进行base64编码(而不是对32位字符串编码)。
以Python为例子:
正确计算的代码为:
>>> import base64,hashlib
>>> hash = hashlib.md5()
>>> hash.update("0123456789")
>>> base64.b64encode(hash.digest())
'eB5eJF1ptWaXm4bijSPyxw=='
需要注意
正确的是:hash.digest(),计算出进制数组(128位)
>>> hash.digest()
'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
常见错误是直接对计算出的32位字符串编码进行base64编码。
例如,错误的是:hash.hexdigest(),计算得到可见的32位字符串编码
>>> hash.hexdigest()
'781e5e245d69b566979b86e28d23f2c7'
错误的MD5值进行base64编码后的结果:
>>> base64.b64encode(hash.hexdigest())
'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='
|
3.1.5、示例
请求示例:
| PUT /test-bucket/test.jpg HTTP/1.1
Host: api.dstor.dnion.com
Content-Encoding: utf-8
Date: Fri, 24 Feb 2017 06:03:28 GMT
Content-Type: image/jpg
Content-Length: 344606
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:kZoYNv66bsmc10+dcGKw5x2PRrk=
[344606 bytes of object data]
|
返回示例:
| HTTP/1.1 200 OK
Date: Fri, 24 Feb 2017 18:52:34 GMT
Content-Length: 0
Connection: keep-alive
x-amz-request-id: 5650BD72207FB30443962F9A
ETag: "A797938C31D59EDD08D86188F6D5B872"
|
3.2、HEAD Object
Head Object只返回某个Object的meta信息,不返回文件内容。
3.2.1、请求语法
| HEAD /ObjectName HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
3.2.2、细节分析
- 不论正常返回200 OK还是非正常返回,Head Object都不返回消息体。
- 如果用户在PutObject的时候传入以x-amz-meta-为开头的user meta,比如x-amz-meta-location,返回消息时,返回这些user meta。
- 如果文件不存在返回404 Not Found错误。
- 响应头中Content-Length、ETag、Content-Md5 均为目标文件的元信息。
3.2.3、示例
请求示例:
| HEAD /test-bucket/test.jpg HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 06:38:30 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:UNQDb7GapEgJCZkcde6OhZ9Jfe8=
|
返回示例:
| HTTP/1.1 200 OK
x-amz-request-id: 3a89276f-2e2d-7965-3ff9-51c875b99c41
Date: Fri, 24 Feb 2017 06:38:30 GMT
Last-Modified: Fri, 24 Feb 2012 06:07:48 GMT
ETag: "fba9dede5f27731c9771645a39863328"
Content-Length: 344606
Content-Type: image/jpg
Connection: keep-alive
|
3.3、GET Object
用于获取某个Object,此操作要求用户对该Object有读权限。
3.3.1、请求语法
| GET /BucketName/ObjectName HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
Range: bytes=ByteRange(可选)
|
名称 |
描述 |
Range |
指定文件传输的范围。如,设定 bytes=0-9,表示传送第0到第9这10个字符。 类型:字符串 默认值:无 |
3.3.3、细节分析
- GET Object通过range参数可以支持断点续传,对于比较大的Object建议使用该功能。
- 如果在请求头中使用Range参数;则返回消息中会包含整个文件的长度和此次返回的范围,例如:Content-Range: bytes 0-9/44,表示整个文件长度为44,此次返回的范围为0-9。如果不符合范围规范,则返回400错误。
- 如果文件不存在返回404 Not Found错误。错误码:NoSuchKey。
- 在自定义Dstor返回请求中的一些Header时,只有请求处理成功(即返回码为200时),Dstor才会将请求的header设置成用户GET请求参数中指定的值。
3.3.4、示例
请求示例:
| GET /test-bucket/test.jpg HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 06:38:30 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:UNQDb7GapEgJCZkcde6OhZ9Jfe8=
|
返回示例:
| HTTP/1.1 200 OK
x-amz-request-id: 3a89276f-2e2d-7965-3ff9-51c875b99c41
Date: Fri, 24 Feb 2017 06:38:30 GMT
Last-Modified: Fri, 24 Feb 2012 06:07:48 GMT
ETag: "5B3C1A2E053D763E1B002CC607C5A0FE "
Content-Type: image/jpg
Content-Length: 344606
[344606 bytes of object data]
|
Range请求示例:
| GET /test-bucket/test.jpg HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 05:38:42 GMT
Range: bytes=10-100
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:qZzjF3DUtd+yK16BdhGtFcCVknM=
|
返回示例:
| HTTP/1.1 206 Partial Content
x-amz-request-id: 28f6508f-15ea-8224-234e-c0ce40734b89
x-amz-object-type: Normal
Date: Fri, 24 Feb 2017 05:38:42 GMT
ETag: "5B3C1A2E053D763E1B002CC607C5A0FE "
Accept-Ranges: bytes
Content-Range: bytes 10-100/344606
Content-Type: image/jpg
Content-Length: 91
[91 bytes of object data]
|
3.4、DELETE Object
DeleteObject用于删除某个Object。
3.4.1、请求语法
| DELETE /BucketName/ObjectName HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
3.4.2、细节分析
- DeleteObject要求对该Object要有写权限。
- 如果要删除的Object不存在,Dstor也返回状态码204( No Content)。
- 如果Bucket不存在,返回404 Not Found。
3.4.3、示例
请求示例:
| DELETE /test-bucket/test.jpg HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 07:45:28 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:zUglwRPGkbByZxm1+y4eyu+NIUs=
|
返回示例:
| HTTP/1.1 204 NoContent
x-amz-request-id: 559CC9BDC755F95A64485981
Date: Fri, 24 Feb 2017 07:45:28 GMT
Content-Length: 0
Connection: keep-alive
|
3.5、Copy Object
4、关于Multipart Upload的操作
除了通过PUT Object接口上传文件到Dstor以外,Dstor还提供了另外一种上传模式——Multipart Upload。用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload上传模式,如:
需要支持断点上传。
上传超过100MB大小的文件。
网络条件较差,和Dstor的服务器之间的链接经常断开。
需要流式地上传文件。
* 上传文件之前,无法确定上传文件的总大小。
4.1、Initiate Multipart Upload
使用Multipart Upload模式传输数据前,必须先调用该接口来通知Dstor初始化一个Multipart Upload事件。该接口会返回一个Dstor服务器创建的全局唯一的Upload ID,用于标识本次Multipart Upload事件。用户可以根据这个ID来发起相关的操作,如中止Multipart Upload、查询Multipart Upload等。
4.1.1、请求语法
| POST /BucketName/ObjectName?uploads HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT date
Authorization: AWS AccessKeyId:SignatureValue
|
4.1.2、响应元素(Response Elements)
名称 |
描述 |
Bucket |
初始化一个Multipart Upload事件的Bucket名称。 类型:字符串 父节点:InitiateMultipartUploadResult |
InitiateMultipartUploadResult |
保存Initiate Multipart Upload请求结果的容器。 类型:容器 子节点:Bucket, Key, UploadId 父节点:None |
Key |
初始化一个Multipart Upload事件的Object名称。 类型:字符串 父节点:InitiateMultipartUploadResult |
UploadId |
唯一标示此次Multipart Upload事件的ID。 类型:字符串 父节点:InitiateMultipartUploadResult |
4.1.3、细节分析
- 该操作计算认证签名的时候,需要加“?uploads”到CanonicalizedResource中。
- 初始化Multipart Upload请求,支持如下标准的HTTP请求头: Content-Encoding,Content-Type,Expires,以及以“x-amz-meta-”开头的用户自定义Headers。具体含义请参见PUT Object接口。
- 初始化Multipart Upload请求,并不会影响已经存在的同名object。
- 服务器收到初始化Multipart Upload请求后,会返回一个XML格式的请求体。该请求体内有三个元素:Bucket,Key和UploadID。请记录下其中的UploadID,以用于后续的Multipart相关操作。
4.1.4、示例
请求示例:
| POST /test-bucket/test.data?uploads HTTP/1.1
Host: api.dstor.dnion.com
Date: Fri, 24 Feb 2017 08:32:21 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:/cluRFtRwMTZpC2hTj4F67AGdM4=
|
返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13 | HTTP/1.1 200 OK
Content-Length: 230
Connection: keep-alive
x-amz-request-id: 42c25703-7503-fbd8-670a-bda01eaec618
Date: Fri, 24 Feb 2017 08:32:21 GMT
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<InitiateMultipartUploadResult xmlns=“http://s3.amazonaws.com/doc/2006-03-01/”>
<Bucket>test-bucket</Bucket>
<Key>test.data</Key>
<UploadId>0004B9894A22E5B1888A1E29F8236E2D</UploadId>
</InitiateMultipartUploadResult>
|
4.2、Upload Part
初始化一个Multipart Upload之后,可以根据指定的Object名和Upload ID来分块(Part)上传数据。每一个上传的Part都有一个标识它的号码(part number,范围是1~10,000)。对于同一个Upload ID,该号码不但唯一标识这一块数据,也标识了这块数据在整个文件内的相对位置。如果你用同一个part号码,上传了新的数据,那么Dstor上已有的这个号码的Part数据将被覆盖。除了最后一块Part以外,其他的part最小为100KB;最后一块Part没有大小限制。
4.2.1、请求语法
| PUT /BucketName/ObjectName?partNumber=PartNumber&uploadId=UploadId HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Content-Length: Size
Authorization: AWS AccessKeyId:SignatureValue
|
4.2.2、细节分析
- 调用该接口上传Part数据前,必须调用Initiate Multipart Upload接口,获取一个Dstor服务器颁发的Upload ID。
- Multipart Upload要求除最后一个Part以外,其他的Part大小都要大于100KB。但是Upload Part接口并不会立即校验上传Part的大小(因为不知道是否为最后一块);只有当Complete Multipart Upload的时候才会校验。
- Dstor会将服务器端收到Part数据的MD5值放在ETag头内返回给用户。
- Part号码的范围是1~10000。如果超出这个范围,Dstor将返回InvalidArgument的错误码。
- 为了保证数据在网络传输过程中不出现错误,用户发送请求时携带Content-MD5,Dstor会计算上传数据的MD5与用户上传的MD5值比较,如果不一致返回InvalidDigest错误码。
4.2.3、示例
请求示例:
| PUT /test-bucket/test.data?partNumber=1&uploadId=0004B9895DBBB6EC98E36 HTTP/1.1
Host: api.dstor.dnion.com
Content-Length:6291456
Date: Fri, 24 Feb 2017 08:32:21 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:J/lICfXEvPmmSW86bBAfMmUmWjI=
[6291456 bytes data]
|
返回示例:
| HTTP/1.1 200 OK
Connection: keep-alive
ETag: 7265F4D211B56873A381D321F586E4A9
x-amz-request-id: 3e6aba62-1eae-d246-6118-8ff42cd0c21a
Date: Fri, 24 Feb 2017 08:32:21 GMT
|
4.3、Complete Multipart Upload
在将所有数据Part都上传完成后,必须调用Complete Multipart Upload API来完成整个文件的Multipart Upload。在执行该操作时,用户必须提供所有有效的数据Part的列表(包括part号码和ETAG);Dstor收到用户提交的Part列表后,会逐一验证每个数据Part的有效性。当所有的数据Part验证通过后,Dstor将把这些数据part组合成一个完整的Object。
4.3.1、请求语法
1
2
3
4
5
6
7
8
9
10
11
12
13 | POST /BucketName/ObjectName?uploadId=UploadId HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Content-Length: Size
Authorization: AWS AccessKeyId:SignatureValue
<CompleteMultipartUpload>
<Part>
<PartNumber>PartNumber</PartNumber>
<ETag>ETag</ETag>
</Part>
...
</CompleteMultipartUpload>
|
4.3.2、请求参数(Request Parameters)
Complete Multipart Upload时,可以通过encoding-type对返回结果中的Key进行编码。
名称 |
描述 |
encoding-type |
指定对返回的Key进行编码,目前支持url编码。Key使用UTF-8字符,但xml 1.0标准不支持解析一些控制字符,比如ascii值从0到10的字符。对于Key中包含xml 1.0标准不支持的控制字符,可以通过指定encoding-type对返回的Key进行编码。 数据类型:字符串 默认值:无,可选值:url |
4.3.3、请求元素(Request Elements)
名称 |
描述 |
CompleteMultipartUpload |
保存Complete Multipart Upload请求内容的容器。 类型:容器 子节点:一个或多个Part元素 父节点:无 |
ETag |
Part成功上传后,Dstor返回的ETag值。 类型:字符串 父节点:Part |
Part |
保存已经上传Part信息的容器。 类型:容器 子节点:ETag, PartNumber 父节点:InitiateMultipartUploadResult |
PartNumber |
Part数目。 类型:整数 父节点:Part |
4.3.4、响应元素(Response Elements)
名称 |
描述 |
Bucket |
Bucket名称。 类型:字符串 父节点:CompleteMultipartUploadResult |
CompleteMultipartUploadResult |
保存Complete Multipart Upload请求结果的容器。 类型:容器 子节点:Bucket, Key, ETag, Location 父节点:None |
ETag |
ETag (entity tag) 在每个Object生成的时候被创建,用于标示一个Object的内容。Complete Multipart Upload请求创建的Object,ETag值是其内容的UUID。ETag值可以用于检查Object内容是否发生变化。. 类型:字符串 父节点:CompleteMultipartUploadResult |
Location |
新创建Object的URL。 类型:字符串 父节点:CompleteMultipartUploadResult |
Key |
新创建Object的名字。 类型:字符串 父节点:CompleteMultipartUploadResult |
EncodingType |
指明返回结果中编码使用的类型。如果请求的参数中指定了encoding-type,那返回的结果会对Key进行编码。 类型:字符串 父节点:容器 |
4.3.5、细节分析
- Complete Multipart Upload时,会确认除最后一块以外所有块的大小都大于100KB,并检查用户提交的Partlist中的每一个Part号码和Etag。所以在上传Part时,客户端除了需要记录Part号码外,还需要记录每次上传Part成功后,服务器返回的ETag值。
- Dstor处理Complete Multipart Upload请求时,会持续一定的时间。在这段时间内,如果客户端和Dstor之间的链接断掉,Dstor仍会继续将请求做完。
- 用户提交的Part List中,Part号码可以是不连续的。例如第一块的Part号码是1;第二块的Part号码是5。
- Dstor处理Complete Multipart Upload请求成功后,该Upload ID就会变成无效。
- 同一个Object可以同时拥有不同的Upload Id,当Complete一个Upload ID后,该Object的其他Upload ID不受影响。
- 若调用Initiate Multipart Upload接口时,指定了x-amz-server-side-encryption请求头,则在Complete Multipart Upload的响应头中,会返回x-amz-server-side-encryption,其值表明该Object的服务器端加密算法。
- 如果用户上传了Content-MD5请求头,Dstor会计算body的Content-MD5并检查一致性,如果不一致,将返回InvalidDigest错误码。
4.3.6、示例
请求示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | POST /test-bucket/multipart.data? uploadId=0004B9B2D2F7815C432C9057C03134D4 HTTP/1.1
Host: api.dstor.dnion.com
Content-Length: 1056
Date: Fri, 24 Feb 2017 10:19:18 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:8VwFhFUWmVecK6jQlHlXMK/zMT0=
<CompleteMultipartUpload>
<Part>
<PartNumber>1</PartNumber>
<ETag>"3349DC700140D7F86A078484278075A9"</ETag>
</Part>
<Part>
<PartNumber>2</PartNumber>
<ETag>"8EFDA8BE206636A695359836FE0A0E0A"</ETag>
</Part>
<Part>
<PartNumber>3</PartNumber>
<ETag>"8C315065167132444177411FDA149B92"</ETag>
</Part>
</CompleteMultipartUpload>
|
返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13 | HTTP/1.1 200 OK
Content-Length: 329
Content-Type: Application/xml
Connection: keep-alive
x-amz-request-id: 594f0751-3b1e-168f-4501-4ac71d217d6e
Date: Fri, 24 Feb 2017 10:19:18 GMT
<?xml version="1.0" encoding="UTF-8"?>
<CompleteMultipartUploadResult xmlns=“http://s3.amazonaws.com/doc/2006-03-01/”>
<Bucket>test-bucket</Bucket>
<Key>test.data</Key>
<ETag>B864DB6A936D376F9F8D3ED3BBE540DD-3</ETag>
</CompleteMultipartUploadResult>
|
4.4、Abort Multipart Upload
该接口可以根据用户提供的Upload ID中止其对应的Multipart Upload事件。当一个Multipart Upload事件被中止后,就不能再使用这个Upload ID做任何操作,已经上传的Part数据也会被删除。
4.4.1、请求语法
| DELETE /BucketName/ObjectName?uploadId=UploadId HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
4.4.2、细节分析
- 中止一个Multipart Upload事件时,如果其所属的某些Part仍然在上传,那么这次中止操作将无法删除这些Part。所以如果存在并发访问的情况,为了彻底释放Dstor上的空间,需要调用几次Abort Multipart Upload接口。
- 如果输入的Upload Id不存在,Dstor会返回404错误,错误码为:NoSuchUpload。
4.4.3、示例
请求示例:
| Delete /bucketname/multipart.data?&uploadId=0004B9895DBBB6EC98E HTTP/1.1
Host: api.dstor.dnion.com
Date: Wed, 22 Feb 2012 08:32:21 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:J/lICfXEvPmmSW86bBAfMmUmWjI=
|
返回示例:
| HTTP/1.1 204
Connection: keep-alive
x-amz-request-id: 059a22ba-6ba9-daed-5f3a-e48027df344d
Date: Wed, 22 Feb 2012 08:32:21 GMT
|
4.5、List Parts
List Parts命令可以罗列出指定Upload ID所属的所有已经上传成功Part。
4.5.1、请求语法
| Get /BucketName/ObjectName?uploadId=UploadId HTTP/1.1
Host: api.dstor.dnion.com
Date: GMT Date
Authorization: AWS AccessKeyId:SignatureValue
|
4.5.2、请求参数(Request Parameters)
名称 |
描述 |
uploadId |
Multipart Upload事件的ID。 类型:字符串 默认值:无 |
max-parts |
规定在Dstor响应中的最大Part数目。 类型:整数 默认值:1,000 |
part-number-marker |
指定List的起始位置,只有Part Number数目大于该参数的Part会被列出。 类型:整数 默认值:无 |
encoding-type |
指定对返回的内容进行编码,指定编码的类型。Key使用UTF-8字符,但xml 1.0标准不支持解析一些控制字符,比如ascii值从0到10的字符。对于Key中包含xml 1.0标准不支持的控制字符,可以通过指定encoding-type对返回的Key进行编码。 数据类型:字符串 默认值:无,可选值:url |
4.5.3、响应元素(Response Elements)
名称 |
描述 |
ListPartsResult |
保存List Part请求结果的容器。 类型:容器 子节点:Bucket, Key, UploadId, PartNumberMarker, NextPartNumberMarker, MaxParts, IsTruncated, Part 父节点:无 |
Bucket |
Bucket名称。 类型:字符串 父节点:ListPartsResult |
EncodingType |
指明对返回结果进行编码使用的类型。如果请求的参数中指定了encoding-type,那会对返回结果中的Key进行编码。 类型:字符串 父节点:ListPartsResult |
Key |
Object名称。 类型:字符串 父节点:ListPartsResult |
UploadId |
Upload事件ID。 类型:字符串 父节点:ListPartsResult |
PartNumberMarker |
本次List结果的Part Number起始位置。 类型:整数 父节点:ListPartsResult |
NextPartNumberMarker |
如果本次没有返回全部结果,响应请求中将包含NextPartNumberMarker元素,用于标明接下来请求的PartNumberMarker值。 类型:整数 父节点:ListPartsResult |
MaxParts |
返回请求中最大的Part数目。 类型:整数 父节点:ListPartsResult |
IsTruncated |
标明是否本次返回的List Part结果列表被截断。“true”表示本次没有返回全部结果;“false”表示本次已经返回了全部结果。 类型:枚举字符串 有效值:true、false 父节点:ListPartsResult |
Part |
保存Part信息的容器。 类型:字符串 子节点:PartNumber,LastModified, ETag, Size 父节点:ListPartsResult |
PartNumber |
标示Part的数字。 类型:整数 父节点:ListPartsResult.Part |
LastModified |
Part上传的时间。 类型:日期 父节点:ListPartsResult.part |
ETag |
已上传Part内容的ETag。 类型:字符串 父节点:ListPartsResult.Part |
Size |
已上传Part大小。 类型:整数 父节点:ListPartsResult.Part |
4.5.4、细节分析
- List Parts支持max-parts和part-number-marker两种请求参数。
- max-parts参数最大值为1000;默认值也为1000。
- 在Dstor的返回结果按照Part号码升序排列。
- 由于网络传输可能出错,所以不推荐用List Part出来的结果(Part Number和ETag值)来生成最后Complete Multipart的Part列表。
4.5.5、示例
请求示例:
| Get /bucketname/multipart.data?uploadId=0004B999EF5A239BB9138C6227D69F95 HTTP/1.1
Host: api.dstor.dnion.com
Date: Thu, 23 Feb 2012 07:13:28 GMT
Authorization: AWS qn6qrrqxo2oawuk53otfjbyc:4qOnUMc9UQWqkz8wDqD3lIsa9P8=
|
返回示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | HTTP/1.1 200
Connection: keep-alive
Content-length: 1221
Content-type: application/xml
x-amz-request-id: 106452c8-10ff-812d-736e-c865294afc1c
Date: Thu, 23 Feb 2012 07:13:28 GMT
<?xml version="1.0" encoding="UTF-8"?>
<ListPartsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Bucket>bucketname</Bucket>
<Key>multipart.data</Key>
<UploadId>0004B999EF5A239BB9138C6227D69F95</UploadId>
<NextPartNumberMarker>5</NextPartNumberMarker>
<MaxParts>1000</MaxParts>
<IsTruncated>false</IsTruncated>
<Part>
<PartNumber>1</PartNumber>
<LastModified>2012-02-23T07:01:34.000Z</LastModified>
<ETag>"3349DC700140D7F86A078484278075A9"</ETag>
<Size>6291456</Size>
</Part>
<Part>
<PartNumber>2</PartNumber>
<LastModified>2012-02-23T07:01:12.000Z</LastModified>
<ETag>"3349DC700140D7F86A078484278075A9"</ETag>
<Size>6291456</Size>
</Part>
<Part>
<PartNumber>3</PartNumber>
<LastModified>2012-02-23T07:02:03.000Z</LastModified>
<ETag>"7265F4D211B56873A381D321F586E4A9"</ETag>
<Size>1024</Size>
</Part>
</ListPartsResult>
|