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