开发者社区 问答 正文

C-SDK之如何实现 管理文件(二)?


设置User Meta


OSS支持用户自定义Meta信息对文件进行描述。比如: aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t *headers;
aos_table_t *resp_headers;
char *bucket_name = "<您的bucket名字>";
char *object_name = "<您的object名字>";
aos_string_t bucket;
aos_string_t object;
char *data = "<object content>";
aos_list_t buffer;
aos_buf_t *content;
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_options(options);
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
headers = aos_table_make(p, 1);
/* 设置用户自定义meta */
apr_table_set(headers, "x-oss-meta-author", "oss");
/* 上传数据到OSS中 */
aos_list_init(&buffer);
content = aos_buf_pack(options->pool, data, strlen(data));
aos_list_add_tail(&content->node, &buffer);
s = oss_put_object_from_buffer(options, &bucket, &object, &buffer, headers, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("put object succeeded\n");
} else {
    printf("put object failed\n");
}
aos_pool_destroy(p);


[backcolor=transparent]注:
  • 因为文件元信息在上传/下载时是附在HTTP Headers中, HTTP协议规定不能包含复杂字符。
  • 一个文件可以有多个类似的参数,但所有的user meta总大小不能超过8KB。


获取文件的元数据


有时候,再向OSS上传文件后或者读取文件前需要获取文件的一些元数据,比如长度,文件类型等,这时候可以通过oss_object_head接口获取文件的元数据。下面代码获取文件的长度和文件类型: void head_object()
{
    aos_pool_t *p = NULL;
    aos_string_t bucket;
    aos_string_t object;
    oss_request_options_t *options = NULL;
    aos_table_t *headers = NULL;
    aos_table_t *resp_headers = NULL;
    aos_status_t *s = NULL;
    char *content_length_str = NULL;
    char *object_type = NULL;
    int64_t content_length = 0;
    aos_pool_create(&p, NULL);
    /* 创建并初始化options */
    options = oss_request_options_create(p);
    init_options(options);
    /* 初始化参数 */
    aos_str_set(&bucket, "<您的bucket名字>");
    aos_str_set(&object, "<您的object名字>");
    headers = aos_table_make(p, 0);
    /* 获取文件元数据 */
    s = oss_head_object(options, &bucket, &object, headers, &resp_headers);
    if (aos_status_is_ok(s)) {
        /* 获取文件长度 */
        content_length_str = (char*)apr_table_get(resp_headers, OSS_CONTENT_LENGTH);
        if (content_length_str != NULL) {
            content_length = atoll(content_length_str);
        }
        /* 获取文件的类型 */
        object_type = (char*)apr_table_get(resp_headers, OSS_OBJECT_TYPE);
        printf("head object succeeded, object type:%s, content_length:%ld\n",
               object_type, content_length);
    } else {
        printf("head object failed\n");
    }
    aos_pool_destroy(p);
}


[backcolor=transparent]注:
  • oss_head_object接口不会去下载文件内容,只会读取文件的元数据,包括系统级别和用户自定义的元数据
  • 完整代码参考:GitHub


拷贝文件


在同一个region中,用户可以对有操作权限的文件进行拷贝操作。以下代码通过oss_copy_object接口实现拷贝一个文件: aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t * headers;
aos_table_t *resp_headers;
char *source_bucket_name = "<您的源bucket名字>";
char *source_object_name = "<您的源object名字>";
char *dest_bucket_name = "<您的目的bucket名字>";
char *dest_object_name = "<您的目的object名字>";
aos_string_t source_bucket;
aos_string_t source_object;
aos_string_t dest_bucket;
aos_string_t dest_object;
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_options(options);
aos_str_set(&source_bucket, source_bucket_name);
aos_str_set(&source_object, source_object_name);
aos_str_set(&dest_bucket, dest_bucket_name);
aos_str_set(&dest_object, dest_object_name);
headers = aos_table_make(p, 0);
/* 拷贝文件 */
s = oss_copy_object(options, &source_bucket, &source_object, &dest_bucket, &dest_object, headers, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("copy object succeeded\n");
} else {
    printf("copy object failed\n");
}
aos_pool_destroy(p);


[backcolor=transparent]注:
  • 需要注意的是源bucket与目的bucket必须属于同一region。
  • 如果拷贝文件超过1G,建议使用分片拷贝文件方式进行拷贝。

展开
收起
青衫无名 2017-10-19 11:00:12 1919 分享 版权
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: