大对象分块接口
大对象可以调用分块上传接口来提高上传成功率,该接口支持断点续传和并发上传。上传数 据分块最小16k,最大100M(最后一块除外)
目录
Initiate Multipart Upload
描述
使用 Multipart Upload 模式传输数据前,必须先调用该接口来通知 NOS 初始化一个 Multipart Upload 事件。该接口会返回一个 NOS 服务器创建的全局唯一的 Upload ID,用于标识本次 Multipart Upload 事件。用户可以根据这个 ID 来发起相关的操作,如中止 Multipart Upload 、 查询 Multipart Upload 等。
语法
POST /${ObjectKey}?uploads HTTP/1.1 HOST: ${BucketName}.${endpoint} Content-Length: ${length} Date: ${date} Authorization: ${signature}
请求头定义
参数 | 描述 | 是否必须 |
---|---|---|
x-nos-meta- | 以该前缀开头的header都将被认为是用户自定义的元数据,比如:x-nos-meta-title: TITLE 这个header会把title:TITLE作为用户自定义元数据key-value对。 类型:字符串 默认:无 |
No |
响应元素
元素 | 描述 |
---|---|
InitiateMultipartUploadResult | 响应容器元素 类型:容器 子节点:Key,Bucket |
Key | 对象的Key 类型:字符串 父节点:InitiateMultipartUploadResult |
Bucket | 对象的桶 类型:字符串 父节点:InitiateMultipartUploadResult |
UploadId | 分块上传的ID,用这个ID来作为各块属于这个文件的标识 类型:字符串 父节点:InitiateMultipartUploadResult |
示例
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>
细节描述
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。
Upload part
描述
传输一个数据块之前需要先调用初始化操作( Initiate Multipart Upload )。在初始化一个 Multipart Upload 之后,可以根据指定的 Object 名和 Upload ID 来分块(Part)上传数据。 每一个上传的 Part 都有一个标识它的号码(part number,范围是 1~10,000)。对于同一个 Upload ID, 该号码不但唯一标识这一块数据,也标识了这块数据在整个文件内的相对位置。 如果你用同一个 part 号码,上传了新的数据,那么 NOS 上已有的这个号码的Part数据将被覆 盖,单块限制为最小为 16k ,最大为 100M,最后一块则没有最大小限制。
语法
PUT /${ObjectKey}?partNumber=${partNumber}&uploadId=${uploadId} HTTP/1.1 HOST: ${BucketName}.${endpoint} Date: ${date} Content-Length: ${size} Authorization: ${signature}
请求头
Header | 描述 | 是否必须 |
---|---|---|
Content-Length | Entity Body 的长度 类型:整型 默认:无 | Yes |
Content-MD5 | Entity Body 的 MD5 摘要 类型:字符串 默认:无 | No |
特殊错误码
错误码 | Http状态码 | 描述 |
---|---|---|
NoSuchUpload | 404 Not Found | 对应的分块上传不存在,可能原因:uploadId 非法、已经执行了 abort、已经执行了 complete 等 |
示例
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
细节描述
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。 HTTP请求头 Content-Length 必须,否则返回 411 Length Required 消息。错误码:MissingContentLength。
Complete Multipart Upload
描述
在将所有数据 Part 都上传完成后,必须调用 Complete Multipart Upload API 来完成整个文件 的 Multipart Upload 。在执行该操作时,用户必须提供所有有效的数据 Part 的列表 (包括 part 号码和 ETAG);NOS 收到用户提交的 Part 列表后,会逐一验证每个数据 Part 的有效性。 当所有的数据 Part 验证通过后,NOS 将把这些数据part组合成一个完整的 Object。
语法
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>
请求头定义
Header | 描述 | 是否必须 |
---|---|---|
x-nos-meta- | 以该前缀开头的header都将被认为是用户自定义的元数据,比如:x-nos-meta-title: TITLE 这个header会把title:TITLE作为用户自定义元数据key-value对。 类型:字符串 默认:无 |
No |
请求元素
元素 | 描述 | 是否必须 |
---|---|---|
CompleteMultipartUpload | 完成块传输的请求容器 类型:容器 子节点:一个或多个Part节点 |
Yes |
ETag | 一块数据上传完毕后,服务器端返回的Entity tag 类型:字符串 父节点:Part |
Yes |
Part | 每一块的描述信息的容器 类型:容器 子节点:PartNumber,ETag |
Yes |
PartNumber | 分块序号。 类型:整型 父节点:Part |
Yes |
响应元素
元素 | 描述 |
---|---|
Bucket | 新创建对象所在的桶 类型:字符串 父节点:CompleteMultipartUploadResult |
CompleteMultipartUploadResult | 响应容器元素 类型:容器 子节点:Location,Bucket,Key,ETag |
ETag | 新创建的对象的Entity Tag 类型:字符串 父节点:CompleteMultipartUploadResult Key 新创建对象的Key |
Key | 新创建的对象的Entity Tag 类型:字符串 父节点:CompleteMultipartUploadResult |
Location | 新创建的这个对象的资源定位URL 类型:字符串 父节点:CompleteMultipartUploadResult |
特殊错误码
错误码 | Http状态码 | 描述 |
---|---|---|
InvalidPart | 400 Bad Request | 请求所指定的上传块中,有一个或多个块不存在,可能的原因:该块缺失未上传,该块的 EntityTag 不匹配等 |
InvalidPartOrder | 400 Bad Request | 上传块列表,不是按照块序号升序排列 |
NoSuchUpload | 404 Not Found | 对应的分块上传不存在,可能原因:uploadId 非法、已经执行了 abort、已经执行了 complete 等 |
示例
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>
细节描述
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. 分块上传的元数据是在调用这个接口后才有效的
Abort Multipart Upload
描述
该接口可以根据用户提供的 Upload ID 中止其对应的 Multipart Upload 事件。当一个 Multipart Upload 事件被中止后,就不能再使用这个 Upload ID 做任何操作,已经上传的 Part 数据也会被删除。
语法
DELETE /${ObjectKey}?uploadId=${uploadId} HTTP/1.1 Host: ${BucketName}.${endpoint} Date: ${Date} Authorization: ${signature}
特殊错误码
错误码 | Http状态码 | 描述 |
---|---|---|
NoSuchUpload | 404 Not Found | 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等 |
示例
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
细节描述
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 上传至少一块数据。
List Parts
描述
List Parts 命令可以罗列出指定 Upload ID 所属的所有已经上传成功 Part。
语法
GET /${ObjectKey}?uploadId=${id}&max-parts=${limit}&part-number-marker=${start} HTTP/1.1 HOST: ${BucketName}.${endpoint} Date: ${date} Authorization: ${signature}
请求参数
参数 | 描述 | 是否必须 |
---|---|---|
max-parts | 响应中的limit个数 类型:整型 默认值:1000 取值:[0-1000] | No |
part-number-marker | 分块号的界限,只有更大的分块号会被列出来。 类型:字符串 默认:无 | No |
uploadId | 分块上传操作的ID 类型:字符串 默认:无 | Yes |
响应元素
元素 | 描述 |
---|---|
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 |
特殊错误码
错误码 | Http状态码 | 描述 |
---|---|---|
NoSuchUpload | 404 Not Found | 对应的分块上传不存在,可能原因:uploadId非法、已经执行了abort、已经执行了complete等 |
示例
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>
细节描述
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 值从小到大排列。
List Multipart Uploads
描述
List Multipart Uploads 可以罗列出所有执行中的 Multipart Upload 事件,即已经被初始化 的 Multipart Upload 但是未被 Complete 或者 Abort 的 Multipart Upload 事件。NOS 返回的罗列 结果中最多会包含 1000 个 Multipart Upload 信息。如果想指定 NOS 返回罗列结果内Multipart Upload信息的数目,可以在请求中添加max-uploads参数。另外,NOS 返回罗列结果中的 IsTruncated元素标明是否还有其他的 Multipart Upload。
语法
GET /?uploads HTTP/1.1 HOST: ${BucketName}.${endpoint} Date: ${date} Authorization: ${signature}
请求头定义
参数 | 描述 | 是否必须 |
---|---|---|
key-marker | 指定某一uploads key,只有大于该key-marker的才会被列出 类型: String |
No |
max-uploads | 最多返回max-uploads条记录 类型: 数字 默认:1000 取值:[0-1000] |
No |
响应元素
元素 | 描述 |
---|---|
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 | ID 父节点:Upload |
StorageClass | 存储级别 类型: String 父节点: Upload |
Initiated | 该分块上传操作被初始化的时间 类型:Date 父节点: Upload |
ListMultipartUploadsResult.Prefix | 当请求中包含了prefix参数时,响应中会填充这一prefix 类型:String 父节点: ListMultipartUploadsResult |
示例
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>
细节描述
1.如果Bucket不存在,返回404 no content错误。错误码:NoSuchBucket。
2.只有Bucket的拥有者才能操作大对象分块接口。非Bucket拥有者执行此类操作将返回403 Forbidden错误。错误码:AccessDenied。
3.通过key-marker和max-uploads参数,能够遍历到Bucket内有多少未完成的多块上传。
4. 返回未完成多块上传按照Key字典序排列。
最后更新:2017-01-03 10:48:53