全部產品
Search
文件中心

:服務端

更新時間:Aug 30, 2018

服務端操作

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

下面會詳細介紹各個介面的功能和注意事項

基礎結構體介紹

  1. typedef struct oss_media_config_s {
  2. char *endpoint;
  3. int is_cname;
  4. char *access_key_id;
  5. char *access_key_secret;
  6. char *role_arn;
  7. } oss_media_config_t;
  8. typedef struct oss_media_files_s {
  9. char *path;
  10. char *marker;
  11. int max_size;
  12. char *next_marker;
  13. int size;
  14. char **file_names;
  15. } 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,下次執行時開始的位置

初始化

  1. /**
  2. * @brief 初始化oss media
  3. * @note 在程式開始的時候應該首先調用此介面,初始化OSS MEDIA C SDK
  4. * @return:
  5. * 返回0時表示成功
  6. * 否則, 表示出現了錯誤,可能導致失敗的原因包括:記憶體不足,apr、curl版本太低等
  7. */
  8. int oss_media_init();

註:

  • 範例程式碼參考:GitHub

銷毀

  1. /**
  2. * @brief 銷毀oss meida
  3. * @note 在程式結束的時候應該最後調用此介面,銷毀OSS MEDIA C SDK
  4. */
  5. void oss_media_destroy();

註:

  • 範例程式碼參考:GitHub

建立儲存空間

  1. /**
  2. * @brief 建立新的儲存空間
  3. * @paramp[in] oss_media_acl_t
  4. * OSS_ACL_PRIVATE 私有讀寫
  5. * OSS_ACL_PUBLIC_READ 公共讀,私有寫
  6. * OSS_ACL_PUBLIC_READ_WRITE 公共讀寫
  7. * @return:
  8. * 返回0時表示成功
  9. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  10. */
  11. int oss_media_create_bucket(oss_media_config_t *config, const char *bucket_name, oss_media_acl_t acl);

樣本程式:

  1. static void init_media_config(oss_media_config_t *config) {
  2. config->endpoint = "your endpoint";
  3. config->access_key_id = "阿里雲提供的access key id";
  4. config->access_key_secret = "阿里雲提供的access key secret";
  5. config->role_arn = "阿里雲存取控制RAM提供的role arn";
  6. config->is_cname = 0;
  7. }
  8. void create_bucket() {
  9. int ret;
  10. char *bucket_name;
  11. oss_media_config_t config;
  12. /* 初始設定變數 */
  13. bucket_name = "<your bucket name>";
  14. init_media_config(&config);
  15. /* 建立儲存空間 */
  16. ret = oss_media_create_bucket(&config, bucket_name, OSS_ACL_PRIVATE);
  17. if (0 == ret) {
  18. printf("create bucket[%s] succeeded.\n", bucket_name);
  19. } else {
  20. printf("create bucket[%s] failed.\n", bucket_name);
  21. }
  22. }

註:

  • 範例程式碼參考:GitHub

刪除儲存空間

  1. /*
  2. * @brief 刪除儲存空間
  3. * @return:
  4. * 返回0時表示成功
  5. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  6. */
  7. int oss_media_delete_bucket(oss_media_config_t *config, const char *bucket_name);

樣本程式:

  1. void delete_bucket() {
  2. int ret;
  3. char *bucket_name;
  4. oss_media_config_t config;
  5. /* 初始設定變數 */
  6. bucket_name = "<your bucket name>";
  7. init_media_config(&config);
  8. /* 刪除儲存空間 */
  9. ret = oss_media_delete_bucket(&config, bucket_name);
  10. if (0 == ret) {
  11. printf("delete bucket[%s] succeeded.\n", bucket_name);
  12. } else {
  13. printf("delete bucket[%s] failed.\n", bucket_name);
  14. }
  15. }

註:

  • 範例程式碼參考:GitHub

建立儲存生命週期規則

  1. /**
  2. * @brief 建立儲存空間生命週期規則
  3. * @note 這些規則可以控制檔案的自動刪除時間
  4. * @return:
  5. * 返回0時表示成功
  6. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  7. */
  8. int oss_media_create_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name, oss_media_lifecycle_rules_t *rules);

樣本程式:

  1. void create_bucket_lifecycle() {
  2. int ret;
  3. char *bucket_name;
  4. oss_media_lifecycle_rules_t *rules;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. bucket_name = "<your bucket name>";
  8. init_media_config(&config);
  9. /* 建立生命週期規則 */
  10. rules = oss_media_create_lifecycle_rules(2);
  11. oss_media_lifecycle_rule_t rule1;
  12. rule1.name = "example-1";
  13. rule1.path = "/example/1";
  14. rule1.status = "Enabled";
  15. rule1.days = 1;
  16. oss_media_lifecycle_rule_t rule2;
  17. rule2.name = "example-2";
  18. rule2.path = "/example/2";
  19. rule2.status = "Disabled";
  20. rule2.days = 2;
  21. rules->rules[0] = &rule1;
  22. rules->rules[1] = &rule2;
  23. /* 設定儲存空間的生命週期規則 */
  24. ret = oss_media_create_bucket_lifecycle(&config,
  25. bucket_name, rules);
  26. if (0 == ret) {
  27. printf("create bucket[%s] lifecycle succeeded.\n", bucket_name);
  28. } else {
  29. printf("create bucket[%s] lifecycle failed.\n", bucket_name);
  30. }
  31. /* 釋放資源 */
  32. oss_media_free_lifecycle_rules(rules);
  33. }

註:

  • 範例程式碼參考:GitHub

獲取儲存空間的生命週期規則

  1. /**
  2. * @brief 獲取儲存空間的生命週期規則
  3. * @return:
  4. * 返回0時表示成功
  5. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS等
  6. */
  7. int oss_media_get_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name, oss_media_lifecycle_rules_t *rules);

樣本程式:

  1. void get_bucket_lifecycle() {
  2. int ret, i;
  3. char *bucket_name;
  4. oss_media_lifecycle_rules_t *rules;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. bucket_name = "<your bucket name>";
  8. init_media_config(&config);
  9. /* 獲取生命週期規則 */
  10. rules = oss_media_create_lifecycle_rules(0);
  11. ret = oss_media_get_bucket_lifecycle(&config, bucket_name, rules);
  12. if (0 == ret) {
  13. printf("get bucket[%s] lifecycle succeeded.\n", bucket_name);
  14. } else {
  15. printf("get bucket[%s] lifecycle failed.\n", bucket_name);
  16. }
  17. for (i = 0; i < rules->size; i++) {
  18. printf(">>>> rule: [name:%s, path:%s, status=%s, days=%d]\n",
  19. rules->rules[i]->name, rules->rules[i]->path,
  20. rules->rules[i]->status, rules->rules[i]->days);
  21. }
  22. /* 釋放資源 */
  23. oss_media_free_lifecycle_rules(rules);
  24. }

註:

  • 範例程式碼參考:GitHub

刪除儲存空間的生命週期規則

  1. /**
  2. * @brief 刪除儲存空間的生命週期規則
  3. * @return:
  4. * 返回0時表示成功
  5. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  6. */
  7. int oss_media_delete_bucket_lifecycle(oss_media_config_t *config, const char *bucket_name);

樣本程式:

  1. void delete_bucket_lifecycle()
  2. {
  3. int ret;
  4. char *bucket_name;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. bucket_name = "<your bucket name>";
  8. init_media_config(&config);
  9. /* 刪除生命週期規則 */
  10. ret = oss_media_delete_bucket_lifecycle(&config, bucket_name);
  11. if (0 == ret) {
  12. printf("delete bucket[%s] lifecycle succeeded.\n", bucket_name);
  13. } else {
  14. printf("delete bucket[%s] lifecycle failed.\n", bucket_name);
  15. }
  16. }

註:

  • 範例程式碼參考:GitHub

刪除檔案

  1. /**
  2. * @brief 刪除儲存空間中特定的檔案
  3. * @return:
  4. * 返回0時表示成功
  5. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  6. */
  7. int oss_media_delete_file(oss_media_config_t *config, const char *bucket_name, const char *key);

樣本程式:

  1. void delete_file() {
  2. int ret;
  3. oss_media_config_t config;
  4. char *file;
  5. char *bucket_name;
  6. /* 初始設定變數 */
  7. file = "oss_media_file";
  8. bucket_name = "<your bucket name>";
  9. init_media_config(&config);
  10. /* 刪除檔案 */
  11. ret = oss_media_delete_file(&config, bucket_name, file);
  12. if (0 == ret) {
  13. printf("delete file[%s] succeeded.\n", file);
  14. } else {
  15. printf("delete file[%s] lifecycle failed.\n", file);
  16. }
  17. }

註:

  • 範例程式碼參考:GitHub

列出檔案

  1. /**
  2. * @brief 列出特定儲存空間內的檔案
  3. * @return:
  4. * 返回0時表示成功
  5. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接OSS,無許可權等
  6. */
  7. int oss_media_list_files(oss_media_config_t *config, const char *bucket_name, oss_media_files_t *files);

樣本程式:

  1. void list_files() {
  2. int ret, i;
  3. char *bucket_name;
  4. oss_media_files_t *files;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. bucket_name = "<your bucket name>>";
  8. init_media_config(&config);
  9. files = oss_media_create_files();
  10. files->max_size = 50;
  11. /* 列舉檔案 */
  12. ret = oss_media_list_files(&config, bucket_name, files);
  13. if (0 == ret) {
  14. printf("list files succeeded.\n");
  15. } else {
  16. printf("list files lifecycle failed.\n");
  17. }
  18. for (i = 0; i < files->size; i++) {
  19. printf(">>>>file name: %s\n", files->file_names[i]);
  20. }
  21. /* 釋放資源 */
  22. oss_media_free_files(files);
  23. }

註:

  • 範例程式碼參考:GitHub

獲取臨時token

  1. /*
  2. * @brief 獲取臨時token
  3. * @param[in]:
  4. mode:
  5. * 'r': 讀模式
  6. * 'w': 覆蓋寫入模式
  7. * 'a': 追加寫入模式
  8. * expiration: 臨時token的有效時間,最小15分鐘,最長1小時,單位秒
  9. * @return:
  10. * 返回0時表示成功
  11. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接阿里雲STS服務,沒有開通RAM、STS,沒有建立Role,參數不合法等
  12. */
  13. int oss_media_get_token(oss_media_config_t *config,
  14. const char *bucket_name,
  15. const char *path,
  16. const char *mode,
  17. int64_t expiration,
  18. oss_media_token_t *token);

樣本程式:

  1. void get_token() {
  2. int ret;
  3. char *bucket_name;
  4. oss_media_token_t token;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. bucket_name = "<your bucket name>";
  8. init_media_config(&config);
  9. /* 獲取臨時token */
  10. ret = oss_media_get_token(&config, bucket_name, "/*", "rwa",
  11. 3600, &token);
  12. if (0 == ret) {
  13. printf("get token succeeded, access_key_id=%s, access_key_secret=%s, token=%s\n",
  14. token.tmpAccessKeyId, token.tmpAccessKeySecret, token.securityToken);
  15. } else {
  16. printf("get token failed.\n");
  17. }
  18. }

註:

  • 範例程式碼參考:GitHub

通過自訂policy獲取token

  1. /**
  2. * @brief 通過指定自訂的policy獲取token
  3. * @param[in]:
  4. * expiration: 臨時token的有效時間,最小15分鐘,最長1小時,單位秒
  5. * @return:
  6. * 返回0時表示成功
  7. * 否則, 返回-1時表示出現了錯誤,可能導致失敗的原因包括:無法連接阿里雲STS服務,沒有開通RAM、STS,沒有建立Role,參數不合法等
  8. */
  9. int oss_media_get_token_from_policy(oss_media_config_t *config,
  10. const char *policy,
  11. int64_t expiration,
  12. oss_media_token_t *token);

樣本程式:

  1. void get_token_from_policy() {
  2. int ret;
  3. oss_media_token_t token;
  4. char *policy;
  5. oss_media_config_t config;
  6. /* 初始設定變數 */
  7. init_media_config(&config);
  8. /* 設定自訂policy */
  9. policy = "{\"Version\":\"1\",\"Statement\":[{\"Effect\":\"Allow\", "
  10. "\"Action\":\"*\", \"Resource\":\"*\"}]}";
  11. /* 獲取token */
  12. ret = oss_media_get_token_from_policy(&config, policy, 3600, &token);
  13. if (0 == ret) {
  14. printf("get token succeeded, access_key_id=%s, access_key_secret=%s, token=%s\n",
  15. token.tmpAccessKeyId, token.tmpAccessKeySecret, token.securityToken);
  16. } else {
  17. printf("get token failed.\n");
  18. }
  19. }

註:

  • 範例程式碼參考:GitHub