OSS Media-C SDK分为客户端,服务端和HLS三部分。本文主要介绍服务端的相关操作。
接口
服务端相关的操作接口位于oss_media.h中,目前提供的接口有:
- oss_media_create_bucket
- oss_media_delete_bucket
- oss_media_create_bucket_lifecycle
- oss_media_get_bucket_lifecycle
- oss_media_delete_bucket_lifecycle
- oss_media_delete_file
- oss_media_list_files
- oss_media_get_token
- oss_media_get_token_from_policy
下面会详细介绍各个接口的功能和注意事项。
基础结构体介绍
typedef struct oss_media_config_s { char *endpoint; int is_cname; char *access_key_id; char *access_key_secret; char *role_arn; } oss_media_config_t; typedef struct oss_media_files_s { char *path; char *marker; int max_size; char *next_marker; int size; char **file_names; } oss_media_files_t;
说明
- endpoint:比如oss-cn-hangzhou.aliyuncs.com。
- is_cname:是否使用了CNAME。
- access_key_id:阿里云提供的访问控制的access key id。
- access_key_secret:阿里云提供的访问控制的access key secret。
- role_arn:阿里云访问控制中创建的角色的Arn,具体位置在:访问控制RAM控制台 -> 角色管理 -> 点击相应角色名称 -> 基本信息 -> Arn,格式类似于acs:ram::xxxxxx:role/yyyy。如果还没有角色,需要创建一个新的角色,并赋予AliyunOSSFullAccess和AliyunSTSAssumeRoleAccess等权限。
- marker:设定结果从marker之后按字母排序的第一个开始返回。
- max_size:设定返回的最大数,取值不能大于1000。
- next_marker:下次执行时开始的位置。
初始化
/** * @brief 初始化oss media * @note 在程序开始的时候应该首先调用此接口,初始化OSS MEDIA C SDK * @return: * 返回0时表示成功 * 否则, 表示出现了错误,可能导致失败的原因包括:内存不足,apr、curl版本太低等 */ int oss_media_init();
说明 示例代码参考:
GitHub。
销毁
/** * @brief 销毁oss meida * @note 在程序结束的时候应该最后调用此接口,销毁OSS MEDIA C SDK */ void oss_media_destroy();
说明 示例代码参考:
GitHub。
创建存储空间
/** * @brief 创建新的存储空间 * @paramp[in] oss_media_acl_t * OSS_ACL_PRIVATE 私有读写 * OSS_ACL_PUBLIC_READ 公共读,私有写 * OSS_ACL_PUBLIC_READ_WRITE 公共读写 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_create_bucket(oss_media_config_t *config, const char *bucket_name, oss_media_acl_t acl);
示例程序:
static void init_media_config(oss_media_config_t *config) { config->endpoint = "your endpoint"; config->access_key_id = "阿里云提供的access key id"; config->access_key_secret = "阿里云提供的access key secret"; config->role_arn = "阿里云访问控制RAM提供的role arn"; config->is_cname = 0; } void create_bucket() { int ret; char *bucket_name; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 创建存储空间 */ ret = oss_media_create_bucket(&config, bucket_name, OSS_ACL_PRIVATE); if (0 == ret) { printf("create bucket[%s] succeeded.\n", bucket_name); } else { printf("create bucket[%s] failed.\n", bucket_name); } }
说明 示例代码参考:
GitHub。
删除存储空间
/* * @brief 删除存储空间 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_delete_bucket(oss_media_config_t *config, const char *bucket_name);
示例程序:
void delete_bucket() { int ret; char *bucket_name; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 删除存储空间 */ ret = oss_media_delete_bucket(&config, bucket_name); if (0 == ret) { printf("delete bucket[%s] succeeded.\n", bucket_name); } else { printf("delete bucket[%s] failed.\n", bucket_name); } }
说明 示例代码参考:
GitHub。
创建存储生命周期规则
/** * @brief 创建存储空间生命周期规则 * @note 这些规则可以控制文件的自动删除时间 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_create_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name, oss_media_lifecycle_rules_t *rules);
示例程序:
void create_bucket_lifecycle() { int ret; char *bucket_name; oss_media_lifecycle_rules_t *rules; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 创建生命周期规则 */ rules = oss_media_create_lifecycle_rules(2); oss_media_lifecycle_rule_t rule1; rule1.name = "example-1"; rule1.path = "/example/1"; rule1.status = "Enabled"; rule1.days = 1; oss_media_lifecycle_rule_t rule2; rule2.name = "example-2"; rule2.path = "/example/2"; rule2.status = "Disabled"; rule2.days = 2; rules->rules[0] = &rule1; rules->rules[1] = &rule2; /* 设置存储空间的生命周期规则 */ ret = oss_media_create_bucket_lifecycle(&config, bucket_name, rules); if (0 == ret) { printf("create bucket[%s] lifecycle succeeded.\n", bucket_name); } else { printf("create bucket[%s] lifecycle failed.\n", bucket_name); } /* 释放资源 */ oss_media_free_lifecycle_rules(rules); }
说明 示例代码参考:
GitHub。
获取存储空间的生命周期规则
/** * @brief 获取存储空间的生命周期规则 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS等 */ int oss_media_get_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name, oss_media_lifecycle_rules_t *rules);
示例程序:
void get_bucket_lifecycle() { int ret, i; char *bucket_name; oss_media_lifecycle_rules_t *rules; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 获取生命周期规则 */ rules = oss_media_create_lifecycle_rules(0); ret = oss_media_get_bucket_lifecycle(&config, bucket_name, rules); if (0 == ret) { printf("get bucket[%s] lifecycle succeeded.\n", bucket_name); } else { printf("get bucket[%s] lifecycle failed.\n", bucket_name); } for (i = 0; i < rules->size; i++) { printf(">>>> rule: [name:%s, path:%s, status=%s, days=%d]\n", rules->rules[i]->name, rules->rules[i]->path, rules->rules[i]->status, rules->rules[i]->days); } /* 释放资源 */ oss_media_free_lifecycle_rules(rules); }
说明 示例代码参考:
GitHub。
删除存储空间的生命周期规则
/** * @brief 删除存储空间的生命周期规则 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_delete_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name);
示例程序:
void delete_bucket_lifecycle() { int ret; char *bucket_name; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 删除生命周期规则 */ ret = oss_media_delete_bucket_lifecycle(&config, bucket_name); if (0 == ret) { printf("delete bucket[%s] lifecycle succeeded.\n", bucket_name); } else { printf("delete bucket[%s] lifecycle failed.\n", bucket_name); } }
说明 示例代码参考:
GitHub 。
删除文件
/** * @brief 删除存储空间中特定的文件 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_delete_file(oss_media_config_t *config, const char *bucket_name, const char *key);
示例程序:
void delete_file() { int ret; oss_media_config_t config; char *file; char *bucket_name; /* 初始化变量 */ file = "oss_media_file"; bucket_name = "<your bucket name>"; init_media_config(&config); /* 删除文件 */ ret = oss_media_delete_file(&config, bucket_name, file); if (0 == ret) { printf("delete file[%s] succeeded.\n", file); } else { printf("delete file[%s] lifecycle failed.\n", file); } }
说明 示例代码参考:
GitHub。
列出文件
/** * @brief 列出特定存储空间内的文件 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接OSS,无权限等 */ int oss_media_list_files(oss_media_config_t *config, const char *bucket_name, oss_media_files_t *files);
示例程序:
void list_files() { int ret, i; char *bucket_name; oss_media_files_t *files; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>>"; init_media_config(&config); files = oss_media_create_files(); files->max_size = 50; /* 列举文件 */ ret = oss_media_list_files(&config, bucket_name, files); if (0 == ret) { printf("list files succeeded.\n"); } else { printf("list files lifecycle failed.\n"); } for (i = 0; i < files->size; i++) { printf(">>>>file name: %s\n", files->file_names[i]); } /* 释放资源 */ oss_media_free_files(files); }
说明 示例代码参考:
GitHub 。
获取临时token
/* * @brief 获取临时token * @param[in]: mode: * 'r': 读模式 * 'w': 覆盖写模式 * 'a': 追加写模式 * expiration: 临时token的有效时间,最小15分钟,最长1小时,单位秒 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接阿里云STS服务,没有开通RAM、STS,没有创建Role,参数不合法等 */ int oss_media_get_token(oss_media_config_t *config, const char *bucket_name, const char *path, const char *mode, int64_t expiration, oss_media_token_t *token);
示例程序:
void get_token() { int ret; char *bucket_name; oss_media_token_t token; oss_media_config_t config; /* 初始化变量 */ bucket_name = "<your bucket name>"; init_media_config(&config); /* 获取临时token */ ret = oss_media_get_token(&config, bucket_name, "/*", "rwa", 3600, &token); if (0 == ret) { printf("get token succeeded, access_key_id=%s, access_key_secret=%s, token=%s\n", token.tmpAccessKeyId, token.tmpAccessKeySecret, token.securityToken); } else { printf("get token failed.\n"); } }
说明 示例代码参考:
GitHub。
通过自定义policy获取token
/** * @brief 通过指定自定义的policy获取token * @param[in]: * expiration: 临时token的有效时间,最小15分钟,最长1小时,单位秒 * @return: * 返回0时表示成功 * 否则, 返回-1时表示出现了错误,可能导致失败的原因包括:无法连接阿里云STS服务,没有开通RAM、STS,没有创建Role,参数不合法等 */ int oss_media_get_token_from_policy(oss_media_config_t *config, const char *policy, int64_t expiration, oss_media_token_t *token);
示例程序:
void get_token_from_policy() { int ret; oss_media_token_t token; char *policy; oss_media_config_t config; /* 初始化变量 */ init_media_config(&config); /* 设置自定义policy */ policy = "{\"Version\":\"1\",\"Statement\":[{\"Effect\":\"Allow\", " "\"Action\":\"*\", \"Resource\":\"*\"}]}"; /* 获取token */ ret = oss_media_get_token_from_policy(&config, policy, 3600, &token); if (0 == ret) { printf("get token succeeded, access_key_id=%s, access_key_secret=%s, token=%s\n", token.tmpAccessKeyId, token.tmpAccessKeySecret, token.securityToken); } else { printf("get token failed.\n"); } }
说明 示例代码参考:
GitHub。