7. 大对象分块接口

大对象可以调用分块上传接口来提高上传成功率,该接口支持断点续传和并发上传。上传数 据分块最小16k,最大100M(最后一块除外)。

7.1. Initiate Multipart Upload

7.1.1. 描述

使用Multipart Upload模式传输数据前,必须先调用该接口来通知NOS初始化一个Multipart Upload事件。该接口会返回一个NOS服务器创建的全局唯一的Upload ID,用于标识本次 Multipart Upload事件。用户可以根据这个ID来发起相关的操作,如中止Multipart Upload、 查询Multipart Upload等。

7.1.2. 语法

POST /${ObjectKey}?uploads HTTP/1.1
HOST: ${BucketName}.${endpoint}
Content-Length: ${length}
Date: ${date}
Authorization: ${signature}

7.1.3. 请求头定义

参数 描述 是否必须
x-nos-meta-
以该前缀开头的header都将被认为是用户自定义的元数据,比如:x-nos-meta-title: TITLE 这个header会把title:TITLE作为用户自定义元数据key-value对。
类型:字符串
默认:无
No

7.1.4. 响应元素

元素 描述
InitiateMultipartUploadResult
响应容器元素
类型:容器
子节点:Key,Bucket
Key
对象的Key
类型:字符串
父节点:InitiateMultipartUploadResult
Bucket
对象的桶
类型:字符串
父节点:InitiateMultipartUploadResult
UploadId
分块上传的ID,用这个ID来作为各块属于这个文件的标识
类型:字符串
父节点:InitiateMultipartUploadResult

7.1.5. 示例

Request

POST /movie.avi?uploads HTTP/1.1
HOST: filestation.nos-eastchina1.126.net
Content-Length: 401
Date: Fri, 10 Feb 2012 21:34:55 GMT
Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE

Response

HTTP/1.1 200 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Wed, 01 Mar 2012 21:34:55 GMT
Content-Length: 197
Connection: close
Server: NOS

<?xml version="1.0" encoding="UTF-8"?>
<InitiateMultipartUploadResult>
    <Bucket>filestation</Bucket>
    <Key>movie.avi</Key>
    <UploadId>VXBsb2FkIElEIGZvciA2aWWpbmcncyBteS1tb3S5tMnRzIHVwbG9hZA</UploadId>
</InitiateMultipartUploadResult>

7.1.6. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. Object名最大长度为1000,如果超出,返回400 Bad Request。错误码:KeyTooLong。
  4. 相同Object能进行多次初始化,得到多个UploadId,后完成的多块上传将覆盖先完成的Object(如果开启版本号,先完成的多块上传将入历史版本)。
  5. HTTP请求头Content-Length必须,否则返回411 Length Required消息。错误码:MissingContentLength。

7.2. Upload part

7.2.1. 描述

传输一个数据块之前需要先调用初始化操作(Initiate Multipart Upload)。在初始化一个 Multipart Upload之后,可以根据指定的Object名和Upload ID来分块(Part)上传数据。 每一个上传的Part都有一个标识它的号码(part number,范围是1~10,000)。对于同一个Upload ID, 该号码不但唯一标识这一块数据,也标识了这块数据在整个文件内的相对位置。 如果你用同一个part号码,上传了新的数据,那么NOS上已有的这个号码的Part数据将被覆 盖,单块限制为最小为16k,最大为100M,最后一块则没有最大小限制。

7.2.2. 语法

PUT /${ObjectKey}?partNumber=${partNumber}&uploadId=${uploadId} HTTP/1.1
HOST: ${BucketName}.${endpoint}
Date: ${date}
Content-Length: ${size}
Authorization: ${signature}

7.2.3. 请求头

Header 描述 是否必须
Content-Length Entity Body的长度 类型:整型 默认:无 Yes
Content-MD5 Entity Body的MD5摘要 类型:字符串 默认:无 No

7.2.4. 特殊错误码

错误码 Http状态码 描述
NoSuchUpload 404 Not Found 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等

7.2.5. 示例

Request

PUT /movie.avi?partNumber=1&uploadId=23r54i252358235-32523f23 HTTP/1.1
HOST: filestation.nos-eastchina1.126.net
Date: Fri, 10 Feb 2012 21:34:55 GMT
Content-Length: 1046203
Content-MD5: bb69583fd4da5970a86aa47c0da561ad
Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE

[1046203 bytes of part data]

Response

HTTP/1.1 200 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Wed, 01 Mar 2012 21:34:55 GMT
ETag: bb69583fd4da5970a86aa47c0da561ad
Connection: close
Server: NOS

7.2.6. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. 调用该接口上传Part数据前,必须调用Initiate Multipart Upload接口,获取一个NOS服务器颁发的Upload ID。
  4. 如果执行Upload Part时,UploadId对应的Object名和Bucket名不匹配,返回:400 Bad Request错误。 错误码:InvalidArgument。
  5. 如果执行Upload Part时,UploadId已经被Abort,或者UploadId本就不存在,返回:404 Not Found错误。错误码:NoSuchUpload。
  6. Multipart Upload要求除最后一个Part以外,其他的Part大小都要大于16k。但是Upload Part接口并不会立即校验上传Part的大小(因为不知道是否为最后一块);只有当Complete Multipart Upload的时候才会校验。
  7. PUT Object<6.6_PUT_Object>类似,NOS根据Content-MD5判断上传的文件块的正确性,如果不匹配,返回404 Bad Request错误,错误码:BadDigest;如果不带Content-MD5,返回Etag,由用户来确保数据正确性。
  8. Part号码的范围是1~10000。如果超出这个范围,NOS将返回InvalidArgument的错误码。
  9. Upload Part请求头中的Content-Length必须和HTTP BODY的长度一致,否则返回400 Bad Request。错误码:IncompleteBody。
  10. 如果Head中没有加入Content length参数,会返回411 Length Required错误。错误码:MissingContentLength。
  11. 如果添加文件长度超过100M,返回错误消息400 Bad Request。错误码:EntityTooLarge。
  12. HTTP请求头Content-Length必须,否则返回411 Length Required消息。错误码:MissingContentLength。

7.3. Complete Multipart Upload

7.3.1. 描述

在将所有数据Part都上传完成后,必须调用Complete Multipart Upload API来完成整个文件 的Multipart Upload。在执行该操作时,用户必须提供所有有效的数据Part的列表 (包括part号码和ETAG);NOS收到用户提交的Part列表后,会逐一验证每个数据Part的有效性。 当所有的数据Part验证通过后,NOS将把这些数据part组合成一个完整的Object。

7.3.2. 语法

POST /${ObjectKey}?uploadId=${uploadId} HTTP/1.1
HOST: ${BucketName}.${endpoint}
Content-MD5:  ${entityMD5}
Content-Length:  ${length}
x-nos-Object-md5: ${ObjectMD5}
Authorization:  ${signature}

<CompleteMultipartUpload>
    <Part>
            <PartNumber>${PartNumber}</PartNumber>
            <ETag>${ETag}</ETag>
    </Part>
    ...
</CompleteMultipartUpload>

7.3.3. 请求头

Header 描述 是否必须
x-nos-meta-
以该前缀开头的header都将被认为是用户自定义的元数据,比如:x-nos-meta-title: TITLE 这个header会把title:TITLE作为用户自定义元数据key-value对。
类型:字符串
默认:无
No

7.3.4. 请求元素

元素 描述 是否必须
CompleteMultipartUpload
完成块传输的请求容器
类型:容器
子节点:一个或多个Part节点
Yes
ETag
一块数据上传完毕后,服务器端返回的Entity tag
类型:字符串
父节点:Part
Yes
Part
每一块的描述信息的容器
类型:容器
子节点:PartNumber,ETag
Yes
PartNumber
分块序号。
类型:整型
父节点:Part
Yes

7.3.5. 响应元素

元素 描述
Bucket
新创建对象所在的桶
类型:字符串
父节点:CompleteMultipartUploadResult
CompleteMultipartUploadResult
响应容器元素
类型:容器
子节点:Location,Bucket,Key,ETag
ETag
新创建的对象的Entity Tag
类型:字符串
父节点:CompleteMultipartUploadResult
Key
新创建对象的Key
类型:字符串
父节点:CompleteMultipartUploadResult
Location
新创建的这个对象的资源定位URL
类型:字符串
父节点:CompleteMultipartUploadResult

7.3.6. 特殊错误码

错误码 Http状态码 描述
InvalidPart 400 Bad Request 请求所指定的上传块中,有一个或多个块不存在,可能的原因:该块缺失未上传,该块的EntityTag不匹配等
InvalidPartOrder 400 Bad Request 上传块列表,不是按照块序号升序排列
NoSuchUpload 404 Not Found 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等

7.3.7. 示例

Reqeust

POST /movie.avi?uploadId=23r54i252358235-32523f23 HTTP/1.1
HOST: filestation.nos-eastchina1.126.net
Content-MD5: bb69583fd4da5970a86aa47c0da561ad
Content-Length: 325
x-nos-Object-md5: fd4da5970a86aa47c0da56bb69363
Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE

<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>

Response

HTTP/1.1 200 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Wed, 01 Mar 2012 21:34:55 GMT
ETag: VXBsb2FkIElEIGZvciA2aWWpbmcncyBtZpZS5tMnRzIHVwbG9hZA
Connection: close
Server: NOS

<?xml version="1.0" encoding="UTF-8"?>
<CompleteMultipartUploadResult xmlns="">
    <Location> filestation.nos-eastchina1.126.net/movie.avi</Location>
    <Bucket>filestation </Bucket>
    <Key>movie.avi </Key>
    <ETag>"3858f62230ac3c915f300c664312c11f"</ETag>
</CompleteMultipartUploadResult>

7.3.8. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. 调用该接口完成大对象分开接口前,必须调用Initiate Multipart Upload接口,获取一个NOS服务器颁发的Upload ID,并调用Upload Part上传至少一块数据。
  4. 如果执行Complete Multipart Upload时,UploadId对应的Object名和Bucket名不匹配,返回:400 Bad Request错误。 错误码:InvalidArgument。
  5. 如果执行Complete Multipart Upload时,UploadId已经被Abort,或者UploadId本就不存在,返回:404 Not Found错误。错误码:NoSuchUpload。
  6. Complete Multipart Upload时,会确认除最后一块以外所有块的大小都大于16k,并检查用户提交的Partlist中的每一个Part号码和Etag。所以在上传Part时,客户端除了需要记录Part号码外,还需要记录每次上传Part成功后,服务器返回的ETag值。
  7. 如果非最后一块小于16k,返回:400 Bad Request。错误码:EntityTooSmall。
  8. 用户提交的Part List中,Part号码可以是不连续的。例如第一块的Part号码是1,第二块的Part号码是5。完成Complete Multipart Upload后,所有没有被提交的已上传Part将被删除。
  9. 用户提交的Part List中,Part号码必须是升序排列的,否则返回:400 Bad Request。错误码:InvalidPartOrder。
  10. 如果用户提交的Part List中存在还为上传完成的Part号码,返回:400 Bad Request。错误码:InvalidPart。
  11. NOS处理Complete Multipart Upload请求成功后,该Upload ID就会变成无效。
  12. 同一个Object可以同时拥有不同的Upload Id,当Complete一个Upload ID后,该Object的其他Upload ID不受影响。
  13. 如果HTTP请求的BODY XML格式有误,返回400 Bad Request消息。错误码:MalformedXML。
  14. HTTP请求头Content-Length必须,否则返回411 Length Required消息。错误码:MissingContentLength。
  15. etag的计算方法是,每个分块的etag加上‘-’,包括最后一个分块,然后求md5,转换为字符串就得到整个大对象的etag了。
  16. 分块上传的元数据是在调用这个接口后才有效的

7.4. Abort Multipart Upload

7.4.1. 描述

该接口可以根据用户提供的Upload ID中止其对应的Multipart Upload事件。当一个Multipart Upload事件被中止后,就不能再使用这个Upload ID做任何操作,已经上传的Part数据也会被删除。

7.4.2. 语法

DELETE /${ObjectKey}?uploadId=${uploadId} HTTP/1.1
Host: ${BucketName}.${endpoint}
Date: ${Date}
Authorization:  ${signature}

7.4.3. 特殊错误码

错误码 Http状态码 描述
NoSuchUpload 404 Not Found 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等

7.4.4. 示例

Request

DELETE /movie.avi?uploadId=23r54i252358235332523f23 HTTP/1.1
Host: filestation.nos-eastchina1.126.net
Date: Mon, 1 May 2012 20:34:56 GMT
Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE

Response

HTTP/1.1 204 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Mon, 1 May 2012 20:34:59 GMT
ETag: VXBsb2FkIElEIGZvciA2aWWpbmcncyBtZpZS5tMnRzIHVwbG9hZA
Connection: close
Server: NOS

7.4.5. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. 如果输入的Upload Id不存在,NOS会返回NoSuchUpload的错误码。
  4. 调用该接口完成大对象分开接口前,必须调用Initiate Multipart Upload接口,获取一个NOS服务器分配的Upload ID,并调用Upload Part上传至少一块数据。

7.5. List Parts

7.5.1. 描述

List Parts命令可以罗列出指定Upload ID所属的所有已经上传成功Part。

7.5.2. 语法

GET /${ObjectKey}?uploadId=${id}&max-parts=${limit}&part-number-marker=${start} HTTP/1.1
HOST: ${BucketName}.${endpoint}
Date: ${date}
Authorization: ${signature}

7.5.3. 请求参数

参数 描述 是否必须
max-parts 响应中的limit个数 类型:整型 默认值:1000 取值:[0-1000] No
part-number-marker 分块号的界限,只有更大的分块号会被列出来。 类型:字符串 默认:无 No
uploadId 分块上传操作的ID 类型:字符串 默认:无 Yes

7.5.4. 响应元素

元素 描述
ListPartsResult
列出已上传块信息
类型:容器
子节点:Bucket、Key、UploadId、Owner、StorageClass、PartNumberMarker、NextPartNumberMarker、MaxParts, IsTruncated、Part
Bucket
桶的名称
类型: String
父节点: ListPartsResult
Key
对象的Key
类型: String
父节点: ListPartsResult
UploadId
分块上传操作的ID
类型: String
父节点: ListPartsResult
ID
对象拥有者的ID
类型: String
父节点: Owner
DisplayName
对象的拥有者.
类型: String
父节点: Owner
Owner
桶拥有者的信息
子节点:ID, DisplayName
类型: 容器
父节点: ListPartsResult
StorageClass
存储级别.
类型: String
父节点: ListPartsResult
PartNumberMarker
上次List操作后的Part number
类型: Integer
父节点: ListPartsResult
NextPartNumberMarker
作为后续List操作的part-number-marker
类型: Integer
父节点: ListPartsResult
MaxParts
响应允许返回的的最大part数目
类型: Integer
父节点: ListPartsResult
IsTruncated
是否截断,如果因为设置了limit导致不是所有的数据集都返回了,则该值设置为true
类型: Boolean
父节点: ListPartsResult
Part
列出相关part信息
子节点:PartNumber, LastModified, ETag, Size
类型: String
父节点: ListPartsResult
PartNumber
识别特定part的一串数字
类型: Integer
父节点: Part
LastModified
该part上传的时间
类型: Date
父节点: Part
ETag
当该part被上传时返回
类型: String
父节点: Part
Size
已上传的 part数据的大小.
类型: Integer
父节点: Part

7.5.5. 特殊错误码

错误码 Http状态码 描述
NoSuchUpload 404 Not Found 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等

7.5.6. 示例

Request

GET /movie.avi?uploadId=23r54i252358235-32523f23 HTTP/1.1
HOST: filestation.nos-eastchina1.126.net
Date: Mon, 1 May 2012 20:34:56 GMT
Authorization: NOS I_AM_ACCESS_ID:I_AM_SIGNATURE

Response

HTTP/1.1 200 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Mon, 1 Feb 2012 20:34:56 GMT
Content-Length: 985
Connection: close
Server: NOS

<?xml version="1.0" encoding="UTF-8"?>
<ListPartsResult>
    <Bucket>example-Bucket</Bucket>
    <Key>example-Object</Key>
<UploadId>23r54i252358235332523f23 </UploadId>
    <Owner>
            <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
            <DisplayName>someName</DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
    <PartNumberMarker>1</PartNumberMarker>
    <NextPartNumberMarker>3</NextPartNumberMarker>
    <MaxParts>2</MaxParts>
    <IsTruncated>true</IsTruncated>
    <Part>
            <PartNumber>2</PartNumber>
            <LastModified>2010-11-10T20:48:34.000Z</LastModified>
            <ETag>"7778aef83f66abc1fa1e8477f296d394"</ETag>
            <Size>10485760</Size>
    </Part>
    <Part>
            <PartNumber>3</PartNumber>
            <LastModified>2010-11-10T20:48:33.000Z</LastModified>
            <ETag>"aaaa18db4cc2f85cedef654fccc4a4x8"</ETag>
            <Size>10485760</Size>
    </Part>
</ListPartsResult>

7.5.7. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. 如果执行List Parts时,UploadId对应的Object名和Bucket名不匹配,返回:400 Bad Request错误。 错误码:InvalidArgument。
  4. 如果执行List Parts时,UploadId已经被Abort,或者UploadId本就不存在,返回:404 Not Found错误。错误码:NoSuchUpload。
  5. 通过max-parts和part-number-marker能够遍历UploadId对应的所有上传块。
  6. 返回结果按照part值从小到大排列。

7.6. List Multipart Uploads

7.6.1. 描述

List Multipart Uploads可以罗列出所有执行中的Multipart Upload事件,即已经被初始化 的Multipart Upload但是未被Complete或者Abort的Multipart Upload事件。NOS返回的罗列 结果中最多会包含1000个Multipart Upload信息。如果想指定NOS返回罗列结果内Multipart Upload信息的数目,可以在请求中添加max-uploads参数。另外,NOS返回罗列结果中的 IsTruncated元素标明是否还有其他的Multipart Upload。

7.6.2. 语法

GET /?uploads HTTP/1.1
HOST: ${BucketName}.${endpoint}
Date: ${date}
Authorization: ${signature}

7.6.3. 请求参数

参数 描述 是否必须
key-marker
指定某一uploads key,只有大于该key-marker的才会被列出
类型: String
No
max-uploads
最多返回max-uploads条记录
类型: 数字
默认:1000
取值:[0-1000]
No

7.6.4. 响应元素

元素 描述
ListMultipartUploadsResult
响应容器元素
类型:容器
子节点:Bucket,KeyMarker,Upload,NextKeyMarker, owner
Bucket
对象的桶
类型:字符串
父节点:ListMultipartUploadsResult
NextKeyMarker
作为后续查询的key-marker
类型:String
父节点:ListMultipartUploadsResult
IsTruncated
是否截断,如果因为设置了limit导致不是所有的数据集都返回了,则该值设置为true
类型:Boolean
父节点: ListMultipartUploadsResult
Upload
类型:容器
子节点:Key,UploadId
父节点:ListMultipartUploadsResult
Key
对象的Key
类型:字符串
父节点:Upload
UploadId
分块上传操作的ID
类型String
父节点:Upload
ID
对象拥有者的ID
类型: String
父节点: Owner
DisplayName
对象的拥有者
类型: String
父节点: Owner
Owner
桶拥有者的信息
类型:容器
子节点:DisplayName|ID
父节点:Upload
StorageClass
存储级别
类型: String
父节点: Upload
Initiated
该分块上传操作被初始化的时间
类型:Date
父节点: Upload
ListMultipartUploadsResult.Prefix
当请求中包含了prefix参数时,响应中会填充这一prefix
类型:String
父节点: ListMultipartUploadsResult

7.6.5. 示例

Request

GET /?uploads&HTTP/1.1
HOST: ${BucketName}.${endpoint}
Date: Mon,1 Nov 2010 20:34:56 GTM
Authorization: ${signature}

Response

HTTP/1.1 200 OK
x-nos-request-id: 17b21e42ac11000001390ab891440240
Date: Mon, 1 Feb 2012 20:34:56 GMT
Content-Length: 197
Connection: close
Server: NOS

<?xml version="1.0" encoding="UTF-8"?>
<ListMultipartUploadsResult>
  <Bucket>Bucket</Bucket>
  <NextKeyMarker>my-movie.m2ts</NextKeyMarker>
  <Upload>
    <Key>my-divisor</Key>
    <UploadId>XMgbGlrZSBlbHZpbmcncyBub3QgaGF2aW5nIG11Y2ggbHVjaw</UploadId>
    <Owner>
      <ID>75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
      <DisplayName>OwnerDisplayName</DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Upload>
  <Upload>
    <Key>my-movie.m2ts</Key>
        <UploadId>VXBsb2FkIElEIGZvciBlbHZpbcyBteS1tb3ZpZS5tMnRzIHVwbG9hZA</UploadId>
        <Owner>
        <ID>b1d16700c70b0b05597d7acd6a3f92be</ID>
        <DisplayName>OwnerDisplayName</DisplayName>
        </Owner>
        <StorageClass>STANDARD</StorageClass>
  </Upload>
</ListMultipartUploadsResult>

7.6.6. 细节描述

  1. 如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
  2. 只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
  3. 通过key-marker和max-uploads参数,能够遍历到Bucket内有多少未完成的多块上传。
  4. 返回未完成多块上传按照Key字典序排列。