开发者社区 问答 正文

C-SDK之如何实现 下载文件(一)?

OSS C SDK提供了丰富的文件下载接口,用户可以通过以下方式从OSS下载文件:

  • 下载文件到内存
  • 下载文件到本地文件
  • 分段下载文件
  • 断点续传下载


下载文件到内存


通过oss_get_object_to_buffer接口,可以实现将文件下载到内存中: aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t *headers;
aos_table_t *params;
aos_table_t *resp_headers;
char *bucket_name = "<您的bucket名字>";
char *object_name = "<您的object名字>";
aos_string_t bucket;
aos_string_t object;
aos_list_t buffer;
aos_buf_t *content;
char *buf;
int64_t len = 0;
int64_t size = 0;
int64_t pos = 0;
aos_pool_create(&p, NULL);
/* 创建并初始化options */
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);
params = aos_table_make(p, 0);
/* 下载文件 */
aos_list_init(&buffer);
s = oss_get_object_to_buffer(options, &bucket, &object, &buffer, headers, params, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("get object succeeded\n");
    /* 将下载内容拷贝到buffer中*/
    len = aos_buf_list_len(&buffer);
    buf = aos_pcalloc(p, len + 1);
    buf[len] = '\0';
    aos_list_for_each_entry(content, &buffer, node) {
    size = aos_buf_size(content);
        memcpy(buf + pos, content->pos, size);
        pos += size;
    }
} else {
    printf("get object failed\n");
}
aos_pool_destroy(p);

[backcolor=transparent]注:
  • 2.0.0相对于1.0.0版本,oss_get_object_to_buffer接口增加了params参数,同时headers和params允许为NULL,1.0.0及其之前版本不支持为NULL
  • oss_get_object_to_buffer_by_url和oss_get_object_to_file_by_url参数也增加了params参数
  • 完整代码参考:GitHub


下载文件到本地文件


通过oss_get_object_to_file接口,可以实现将文件下载到指定文件: aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t *headers;
aos_table_t *params;
aos_table_t *resp_headers;
char *bucket_name = "<您的bucket名字>";
char *object_name = "<您的object名字>";
char *filepath = "<本地文件路径>";
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_pool_create(&p, NULL);
/* 创建并初始化options */
options = oss_request_options_create(p);
init_options(options);
/* 初始化参数 */
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, filepath);
headers = aos_table_make(p, 0);
params = aos_table_make(p, 0);
/* 下载文件 */
s = oss_get_object_to_file(options, &bucket, &object, &file, headers, params, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("get object succeeded\n");
} else {
    printf("get object failed\n");
}
aos_pool_destroy(p);

[backcolor=transparent]注:
  • 2.0.0相对于1.0.0版本,oss_get_object_to_file接口增加了params参数,同时headerss和params允许为NULL,1.0.0及其之前版本不支持为NULL。
  • 如果本地有同名文件 filepath,本地文件将会被覆盖;
  • 完整代码参考:GitHub






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

(&p, NULL); options = oss_request_options_create(p); oss_init_options(options, NULL); headers = aos_table_make(p, 0); params = aos_table_make(p, 0);

aos_str_set(&bucket, bucket_name); aos_str_set(&object, object_name);

// 下载文件到内存 s = oss_get_object_to_buffer(options, &bucket, &object, headers, params, &buffer, NULL); if (aos_status_is_ok(s)) { // 获取下载内容的长度 aos_list_for_each_entry(aos_buf_t, content, &buffer, node) { len += content->length; }

// 分配足够的内存来保存整个文件内容
buf = (char*)malloc(len + 1); // +1是为了存放字符串结束符'\0'
if (buf) {
    pos = 0;
    aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
        memcpy(buf + pos, content->data, content->length);
        pos += content->length;
    }
    buf[len] = '\0'; // 添加字符串结束符
    size = len;
    
    // 此时,buf中存储了从OSS下载的文件内容,可以进行相应处理
    // ...
    
    free(buf); // 使用完毕后,记得释放内存
} else {
    printf("Memory allocation failed.\n");
}

} else { printf("Failed to get object to buffer, error code: %d, error message: %s\n", s->code, aos_status_error_message(s)); }

aos_pool_destroy(p);


这段代码示例展示了如何使用阿里云对象存储服务(OSS)C SDK中的`oss_get_object_to_buffer`接口将文件下载到内存中。请确保在使用前已经正确配置了OSS的访问密钥、端点等信息,并且导入了必要的OSS C SDK头文件。

注意几点:
- `aos_pool_create`用于创建一个内存池,管理本操作中使用的内存。
- `oss_request_options_create`和`oss_init_options`初始化请求选项。
- `aos_table_make`创建HTTP头部和参数表。
- `aos_str_set`用于设置桶名和对象名。
- 成功下载后,通过遍历`aos_list_t buffer`并将所有`aos_buf_t`结构体中的数据复制到一块连续的内存中,实现了文件内容的获取。
- 最后,不要忘记使用`free`释放手动分配的内存,并用`aos_pool_destroy`销毁内存池以避免内存泄漏。
有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答