# ks3-c-sdk **Repository Path**: cwen/ks3-c-sdk ## Basic Information - **Project Name**: ks3-c-sdk - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-01-16 - **Last Updated**: 2023-01-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README KS3 SDK For C/C++ 使用指南 ---------------------- ### 注意 文档中的示例代码仅供参考之用,具体使用的时候请参考 KS3 API 文档,根据自己的实际情况调节参数。 ### 1、概述 此 SDK 适用于 Linux/Windows 环境下 C/C++ 版本。基于 KS3 API 构建。 ### 2、初始化 ### 2.1 下载源码 ### 2.2 获取密钥 1. 开通 KS3 服务,https://www.ksyun.com/user/register 注册账号 2. 进入控制台, https://ks3.console.ksyun.com/console.html#/setting 获取 AccessKeyID 、AccessKeySecret ### 2.3 常用术语介绍 #### Object(对象,文件) 在 KS3 中,用户操作的基本数据单元是 Object。单个 Object 允许存储 0~48.8TB 的数据。 Object 包含 key 和 data。其中,key 是 Object 的名字;data 是 Object 的数据。key 为 UTF-8 编码,且编码后的长度不得超过 1024 个字符。 #### Key(文件名) 即 Object 的名字,key 为 UTF-8 编码,且编码后的长度不得超过 1024 个字符。Key 中可以带有斜杠,当 Key 中带有斜杠的时候,将会自动在控制台里组织成目录结构。 **其他术语请参考[概念与术语](https://docs.ksyun.com/documents/2286)** ### 3、快速入门 请先阅读 [常用概念术语文档](https://docs.ksyun.com/documents/2286) 常见示例请参考源码中 example.c 文件 ### 3.1 创建一个 bucket ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = create_bucket(host, bucket, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.2 删除一个 bucket ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = delete_bucket(host, bucket, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.3 列出用户所有空间 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = list_all_bucket(host, ak, sk, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.4 上传文件 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* object_key = "YOUR_OBJECT_KEY"; const char* filename = "LOCAL_DISK_FILE_PATH"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; const char* headers = "x-kss-acl:public-read"; int error; buffer* resp = NULL; resp = upload_file_object(host, bucket, object_key, filename, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.5 分块上传 #### 3.5.1 初始化分块上传 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* object_key = "YOUR_OBJECT_KEY"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; const char* headers = "x-kss-acl:public-read"; int error; buffer* resp = NULL; resp = init_multipart_upload(host, bucket, object_key, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); // 从response body中解析出uploadid: char uploadid_str[128]; char *oid_beg_ptr = strstr(resp->body, ""); if (oid_beg_ptr) { oid_beg_ptr += strlen(""); char *oid_end_ptr = strstr(oid_beg_ptr, ""); if (oid_end_ptr) { strncpy(uploadid_str, oid_beg_ptr, oid_end_ptr - oid_beg_ptr); uploadid_str[oid_end_ptr - oid_beg_ptr] = 0; } } ``` ##### 3.5.2 上传分块数据 ``` char* data_buf = "hello world"; int data_len = strlen(data_buf); int partNumber = 1; resp = upload_part(host, bucket, object_key, ak, sk, uploadid_str, partNumber, data_buf, data_len, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 3.5.3 完成分块上传 ``` // 构造request body (如下是一块的例子,如果多块,则Part部分重复拼接多次) snprintf(com_xml, sizeof(com_xml), "\n" "\n" "%d\n" "\"%.*s\"" "\n", 1, 32, etag_ptr); resp = complete_multipart_upload(host, bucket, object_key, ak, sk, uploadid_str, com_xml, strlen(com_xml), NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 3.5.4 列举已经上传的块 ``` resp = list_multipart_uploads(host, bucket, ak, sk, uploadid_str, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 3.5.5 取消分块上传 ``` resp = abort_multipart_upload(host, bucket, object_key, ak, sk, uploadId, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ### 3.6 带 header 上传文件 **注意:header 之间要以’\n’分隔** ``` const char* headers = "x-kss-acl:public-read\nx-kss-callbackurl:http://www.callbackurl.com/"; resp = upload_file_object(host, bucket, object_key, filename, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.7 下载文件 ``` const char* to_save_file_name = "./local_save"; resp = download_file_object(host, bucket, object_key, to_save_file_name, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.8 删除文件 ``` const char* object_key = "YOUR_OBJECT_KEY"; resp = delete_object(host, bucket, object_key, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.9 复制文件 ``` const char* src_bucket = "SRC_BUCKET_NAME"; const char* src_object_key = "SRC_OBJECT_KEY"; const char* dst_bucket = "DST_BUCKET"; const char* dst_object_key = "DST_OBJECT_KEY"; resp = copy_object(host, src_bucket, src_object_key, dst_bucket, dst_object_key, ak, sk, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 3.10 上传 buf object ``` const char* buf = "hello world"; int buf_len = strlen(buf); resp = upload_object(host, bucket, object_key, buf, buf_len, ak, sk, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } free(buf); buffer_free(resp); ```