package com.qiniu.storage;
import com.qiniu.common.Constants;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Client;
import com.qiniu.http.MethodType;
import com.qiniu.util.Json;
import com.qiniu.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 分片上传 v2 版 api: 完成文件上传
* 在将所有数据 Part 都上传完成后,必须调用 ApiUploadV2CompleteUpload API 来完成整个文件的 Multipart Upload。用户需要提供有效数据的
* Part 列表( 包括 PartNumber 和调用 uploadPart API 服务端返回的 Etag )。服务端收到用户提交的 Part 列表后,会逐一验证每个数据
* Part 的有效性。当所有的数据 Part 验证通过后,会把这些数据 Part 组合成一个完整的 Object。
*
* 一个文件被分成多个 part,上传所有的 part,然后在七牛云根据 part 信息合成文件
* |----------------------------- file -----------------------------|
* |------ part ------|------ part ------|------ part ------|...
* |----- etag01 -----|----- etag02 -----|----- etag03 -----|...
* allBlockCtx = [{"partNumber":1, "etag", etag01}, {"partNumber":2, "etag", etag02}, {"partNumber":3, "etag", etag03}, ...]
*
* 上传过程:
* 1. 调用 {@link ApiUploadV2InitUpload} api 创建一个 upload 任务,获取 uploadId {@link ApiUploadV2InitUpload.Response#getUploadId()}
* 2. 重复调用 {@link ApiUploadV2UploadPart} api 直到文件所有的 part 均上传完毕, part 的大小可以不相同
* 3. 调用 {@link ApiUploadV2CompleteUpload} api 组装 api
* 选用接口:
* 1. {@link ApiUploadV2ListParts} 列举已上传的 part 信息
* 2. {@link ApiUploadV2AbortUpload} 终止上传
*
* 注意事项:
* 1. partNumber 范围是 1 ~ 10000
* 2. 除最后一个 Part 外,单个 Part 大小范围 1 MB ~ 1 GB
* 3. 如果你用同一个 PartNumber 上传了新的数据,那么服务端已有的这个号码的 Part 数据将被覆盖
* 4. {@link ApiUploadV2InitUpload}、{@link ApiUploadV2UploadPart}、{@link ApiUploadV2CompleteUpload}、{@link ApiUploadV2ListParts}、
* {@link ApiUploadV2AbortUpload} 分片 V2 API的 key 需要统一(要么有设置且相同,要么均不设置)
*
* https://developer.qiniu.com/kodo/6368/complete-multipart-upload
*/
public class ApiUploadV2CompleteUpload extends ApiUpload {
/**
* api 构建函数
*
* @param client 请求 Client
*/
public ApiUploadV2CompleteUpload(Client client) {
super(client);
}
/**
* api 构建函数
*
* @param client 请求 Client
* @param config 请求流程的配置信息
**/
public ApiUploadV2CompleteUpload(Client client, Config config) {
super(client, config);
}
/**
* 发起请求
*
* @param request 请求对象 【必须】
* @return 响应对象
* @throws QiniuException 请求异常
*/
public Response request(Request request) throws QiniuException {
return new Response(requestWithInterceptor(request));
}
/**
* 请求信息
*/
public static class Request extends ApiUpload.Request {
public static final String PART_ETG = "etag";
public static final String PART_NUMBER = "partNumber";
private String key;
private String fileName;
private String fileMimeType;
private String uploadId;
private List