开发者社区 问答 正文

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


查看所有文件


通过oss_list_object接口,可以列出当前存储空间下的所有文件。 aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t *resp_headers;
char *bucket_name = "<您的bucket名字>";
aos_string_t bucket;
oss_list_object_params_t *params;
oss_list_object_content_t *content;
int max_ret = 1000;
char *key;
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_options(options);
aos_str_set(&bucket, bucket_name);
params = oss_create_list_object_params(p);
params->max_ret = max_ret;
aos_str_set(¶ms->prefix, "<查看文件的前缀>");
aos_str_set(¶ms->delimiter, "<查看文件的分隔符>");
aos_str_set(¶ms->marker, "<查看文件的起点>");
s = oss_list_object(options, &bucket, params, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("get object succeeded\n");
    /* 下载文件 */
    aos_list_for_each_entry(content, ¶ms->object_list, node) {
    key = apr_psprintf(p, "%.*s", content->key.len, content->key.data);
    }
} else {
    printf("get object failed\n");
}
aos_pool_destroy(p);

[backcolor=transparent]注:
  • 默认情况下,如果存储空间中的文件数量大于1000,则只会返回1000个文件, 且返回结果中 truncated为true,并返回next_marker作为下此读取的起点。若想增大返回文件数目,可以修改 max_ret参数,或者使用marker参数分次读取。
  • 完整代码参考:GitHub


创建模拟目录


OSS是基于对象的存储服务,没有目录的概念。创建模拟目录本质上来说是创建了一个size为0的文件。对于这个文件照样可以上传下载,只是控制台会对以”/“结尾的文件以文件夹的方式展示,所以用户可以使用上述方式来实现创建模拟目录。 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 = "<您的文件夹名字/>";
aos_string_t bucket;
aos_string_t object;
char *data = "";
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, 0);
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("create dir succeeded\n");
} else {
    printf("create dir failed\n");
}
aos_pool_destroy(p);

[backcolor=transparent]注:


设定Object的Http Header


向OSS上传文件时,除了文件内容,还可以指定文件的一些属性信息,称为“元信息”。这些信息在上传时与文件一起存储,在下载时与文件一起返回。下面代码为文件设置了过期时间: 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(&object, object_name);
aos_str_set(&bucket, bucket_name);
headers = aos_table_make(p, 0);
/* 设置http header */
headers = aos_table_make(p, 1);
apr_table_set(headers, "Expires", "Fri, 28 Feb 2012 05:38:42 GMT");
/* 读取数据到buffer中 */
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 Header有:Cache-Control 、 Content-Disposition 、Content-Encoding、 Expires 。它们的相关介绍见 RFC2616
  • 完整代码参考:GitHub






展开
收起
青衫无名 2017-10-19 10:58:55 1888 分享 版权
阿里云 AI 助理回答

您提到的代码片段是使用阿里云Object Storage Service(OSS)的C SDK来列出存储空间(Bucket)下的所有文件(Object)。下面是对这段代码的一个简要解析和补充说明,帮助您更好地理解和使用该接口。

代码解析

  1. 初始化资源池:

    aos_pool_t *p;
    aos_pool_create(&p, NULL);
    

    这里创建了一个资源池aos_pool_t,用于管理内存等资源。

  2. 设置请求选项:

    oss_request_options_t *options;
    oss_request_options_init(options, p);
    // 可以在这里设置认证信息、超时时间等
    

    初始化请求选项,并配置必要的参数,如AccessKey、SecretKey以及连接超时等。

  3. 定义响应头和错误处理:

    aos_status_t *s;
    aos_table_t *resp_headers;
    

    aos_status_t用于存储操作结果的状态,aos_table_t则用于接收HTTP响应头。

  4. 指定Bucket名称:

    char *bucket_name = "";
    aos_string_t bucket;
    aos_str_set(&bucket, bucket_name);
    

    设置需要列出文件的Bucket名称。请确保bucket_name变量被正确赋值为您的Bucket名。

  5. 设置列举对象参数:

    oss_list_object_params_t *params;
    oss_list_object_params_init(params, &bucket);
    params->max_ret = max_ret; // 指定每次返回的最大对象数量
    

    初始化列举对象参数,并设置最大返回数量。默认情况下,OSS会返回最多100个对象,您可以根据需要调整这个值。

  6. 执行列举操作:

    s = oss_list_object(options, &bucket, params, &resp_headers);
    if (aos_status_is_ok(s)) {
       // 成功获取到对象列表
       oss_list_object_content_t *content = NULL;
       while ((content = oss_get_next_object_info(params, resp_headers))) {
           printf("Object Key: %s\n", content->key.data);
           // 处理每个对象的信息,比如打印出Key
       }
    } else {
       // 错误处理
       printf("Failed to list objects, error code: %d, error message: %s\n",
              aos_status_code(s), aos_status_error_message(s));
    }
    
  7. 清理资源:

    aos_pool_destroy(p);
    

    操作完成后,销毁资源池,释放相关资源。

注意事项

  • 确保在使用前已正确安装并配置了阿里云OSS C SDK。
  • 替换bucket_name变量中的字符串为您实际的Bucket名称。
  • 根据实际情况调整max_ret的值,以控制每次调用返回的对象数量。
  • 考虑分页处理大量对象的情况,因为一次调用可能无法列出所有对象,特别是当Bucket中包含成千上万个对象时。
  • 记得处理API调用失败的情况,进行相应的错误处理逻辑。

通过上述步骤,您可以成功地列出指定Bucket下的所有文件。如果有更具体的问题或需要进一步的帮助,请随时告知。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: