int test_multipart_upload_from_file() {
tos_client_t *client = NULL;
tos_error_t *error = NULL;
create_multipart_upload_input_t *create_multipart_upload_input = NULL;
create_multipart_upload_output_t *create_multipart_upload_output = NULL;
upload_part_from_file_input_t *upload_part_from_file_input = NULL;
upload_part_from_file_output_t *upload_part_from_file_output = NULL;
tos_file_buf_t *fb = NULL;
int64_t file_length = 0;
list_parts_input_t *list_part_input = NULL;
list_parts_output_t *list_part_output = NULL;
upload_part_t *part_content = NULL;
complete_multipart_upload_input_t *complete_multipart_upload_input = NULL;
complete_multipart_upload_output_t *complete_multipart_upload_output = NULL;
upload_part_t *complete_part_content = NULL;
tos_pool_create(&p, NULL);
client = tos_client_create(p);
init_test_tos_client(client);
tos_str_set(&bucket, TEST_BUCKET_NAME);
tos_str_set(&object, TEST_MULTIPART_OBJECT);
if (create_multipart_upload_input_new(client->pool, &create_multipart_upload_input) != TOSE_OK)
tos_str_set(&create_multipart_upload_input->bucket, bucket.data);
tos_str_set(&create_multipart_upload_input->key, object.data);
create_multipart_upload_input->acl = ACL_PRIVATE;
create_multipart_upload_input->storage_class = STORAGE_CLASS_IA;
error = create_multipart_upload(client, create_multipart_upload_input, &create_multipart_upload_output);
printf("Init multipart upload succeeded, upload_id:%.*s\n",
create_multipart_upload_output->upload_id.len,
create_multipart_upload_output->upload_id.data);
printf("Init multipart upload failed, request_id:%.*s, status_code:%d, message:%.*s, ec:%.*s\n",
error->request_id.len, error->request_id.data,
error->message.len, error->message.data,
error->ec.len, error->ec.data);
if((fb = tos_create_file_buf(p)) == NULL)
if (tos_open_file_for_all_read(p, TEST_FILE_PATH, fb) != TOSE_OK)
file_length = fb->file_last;
apr_file_close(fb->file);
if (upload_part_from_file_input_new(client->pool, &upload_part_from_file_input) != TOSE_OK)
tos_str_set(&upload_part_from_file_input->upload_id, create_multipart_upload_output->upload_id.data);
tos_str_set(&upload_part_from_file_input->bucket, TEST_BUCKET_NAME);
tos_str_set(&upload_part_from_file_input->key, TEST_MULTIPART_OBJECT);
tos_str_set(&upload_part_from_file_input->file_path, TEST_FILE_PATH);
while (pos < file_length) {
upload_part_from_file_input->part_number = part_num++;
upload_part_from_file_input->offset = pos;
upload_part_from_file_input->part_size = pos + 10 * 1024 * 1024 > file_length ? file_length - pos : 10 * 1024 * 1024;
pos += upload_part_from_file_input->part_size;
error = upload_part_from_file(client, upload_part_from_file_input, &upload_part_from_file_output);
printf("Multipart upload part from file succeeded\n");
printf("Multipart upload part from file failed, request_id:%.*s, status_code:%d, message:%.*s, ec:%.*s\n",
error->request_id.len, error->request_id.data,
error->message.len, error->message.data,
error->ec.len, error->ec.data);
if (list_parts_input_new(client->pool,&list_part_input) != TOSE_OK)
list_part_input->max_parts = 1000;
tos_str_set(&list_part_input->bucket,bucket.data);
tos_str_set(&list_part_input->key,object.data);
tos_str_set(&list_part_input->upload_id,create_multipart_upload_output->upload_id.data);
error = list_parts(client,list_part_input,&list_part_output);
printf("List multipart succeeded\n");
tos_list_for_each_entry(upload_part_t, part_content, &list_part_output->parts, node) {
printf("part_number = %d, size = %ld, last_modified = %s, etag = %s\n",
part_content->part_number,
part_content->last_modified.data,
part_content->etag.data);
printf("List multipart failed, request_id:%.*s, status_code:%d, message:%.*s, ec:%.*s\n",
error->request_id.len, error->request_id.data,
error->message.len, error->message.data,
error->ec.len, error->ec.data);
if (complete_multipart_upload_input_new(client->pool,&complete_multipart_upload_input) != TOSE_OK)
tos_list_for_each_entry(upload_part_t, part_content, &list_part_output->parts, node) {
complete_part_content = create_list_parts_content(p);
complete_part_content->part_number = part_content->part_number;
tos_str_set(&complete_part_content->etag, part_content->etag.data);
tos_list_add_tail(&complete_part_content->node, &complete_multipart_upload_input->parts);
tos_str_set(&complete_multipart_upload_input->bucket,bucket.data);
tos_str_set(&complete_multipart_upload_input->key,object.data);
tos_str_set(&complete_multipart_upload_input->upload_id,create_multipart_upload_output->upload_id.data);
error = complete_multipart_upload(client,complete_multipart_upload_input,&complete_multipart_upload_output);
printf("Complete multipart upload from file succeeded, key:%.*s\n",
complete_multipart_upload_output->key.len, complete_multipart_upload_output->key.data);
printf("Complete multipart upload from file failed, request_id:%.*s, status_code:%d, message:%.*s, ec:%.*s\n",
error->request_id.len, error->request_id.data,
error->message.len, error->message.data,
error->ec.len, error->ec.data);