开发者社区 问答 正文

oss c sdk 上传appendobject相关

各位大牛好,最近在使用oss c sdk进行上传开发,业务场景如下:
客户端开放给用户上传功能,用于客户上传任意文件,不限大小,几十到几百M不等,由于文件并不算小,所以希望提供断点续传的功能。
查阅文档发现未完成的分片上传最多只能保留24小时,断点续传是基于分片上传的,那也不能使了,剩下的唯一的方法就是追加上传,但是在查阅追加上传的相关文档时,发现并不算是介绍的很详细,亦或是我自己没有找到相关资料,简单讲就是通过示例的代码无法实现追加上传,http的请求头里是要追加append相关参数的,但示例里面并没有介绍如何追加这些参数,所以总是失败。希望有大牛来介绍一下append操作具体应该填些什么参数。


另外,感觉c的sdk很简陋,上传过程中的进度回调函数void(int64, int64)既没有void*的入参用于开发者将回调与具体的上传任务联系起来,返回值void也无法对上传行为做任何修正,这就带来两个问题:
1.如果多个上传任务并发,单靠一个void(int64, int64)怎么区分这是哪个任务的进度回调呢?
2.上传任务需要终止时,如何停止。oss的网络通信基于libcurl,libcurl的进度回调里可以通过返回abort来终止通信,oss里该如何“优雅的”停止呢?
由于上述问题,现在我的处理是单任务模式,终止上传时,在上传进度回调里检查到停止操作后直接aos_pool_destroy来终止通信。但我觉得不够优雅,希望有大牛来指点指点。

展开
收起
sware 2018-03-31 11:10:29 2187 分享 版权
阿里云 AI 助理回答

针对您的问题,我将分两部分进行解答:

1. 追加上传(Append Upload)的实现

在阿里云OSS中,追加上传适用于需要不断向一个已存在的对象后追加数据的场景。对于C SDK中的追加上传功能,您需要确保几个关键点:

  • 对象必须是追加上传类型:首先,您需要创建一个具有“追加上传”属性的对象。这通常在首次上传时通过设置HTTP头x-oss-object-type: Appendable来完成。

  • 使用正确的API和参数:在C SDK中,追加上传主要通过调用aos_append_object函数实现。这个函数允许您向已存在的追加型对象后面添加数据。示例如下:

#include "aliyun/oss/oss_api.h"

int main() {
    // 初始化OSSClient等操作省略...

    aos_pool_t *p = NULL;
    aos_string_t bucket;
    aos_string_t object;
    aos_table_t *headers = NULL;
    aos_table_t *params = NULL;
    aos_string_t body;
    oss_request_options_t *options = NULL;
    aos_status_t *s = NULL;

    // 初始化相关变量
    aos_pool_create(&p, NULL);
    options = oss_request_options_create(p);
    // 设置您的AccessKeyId、AccessKeySecret、Endpoint等信息
    // ...

    // 初始化bucket和object名称
    aos_str_set(&bucket, "<your-bucket-name>");
    aos_str_set(&object, "<your-object-key>");

    // 创建或获取用于追加的文件内容
    // 假设body指向您要追加的数据
    // aos_str_set(&body, "<your-data>");

    // 追加上传
    s = oss_append_object(options, &bucket, &object, headers, params, &body);

    if (aos_status_is_ok(s)) {
        printf("Append object succeeded\n");
    } else {
        printf("Append object failed, error code: %d, error message: %s\n", 
               aos_status_code(s), aos_status_error_message(s));
    }

    // 清理资源
    aos_pool_destroy(p);

    return 0;
}

注意,上述代码是一个基础示例,实际应用中您需要根据自己的需求调整,比如错误处理、资源管理等。

2. 关于SDK使用的进阶问题

多任务并发与进度回调区分

  • 对于多任务并发下的进度跟踪,由于C SDK提供的回调接口确实较为简单,没有直接提供任务标识参数,您可以考虑自定义一个任务管理结构,其中包含每个任务的上下文信息(如任务ID、OSS请求句柄等),然后在回调函数外部维护一个这样的任务列表。当回调触发时,通过某种方式(比如根据当前执行的线程或时间戳匹配)关联到具体的任务上下文中去。

优雅地停止上传

  • 在OSS C SDK中,优雅地终止一个正在进行的上传操作确实比较棘手,因为标准接口不直接支持取消操作。一种可能的方案是在您的业务逻辑层面上控制,比如在进度回调中检测到应终止上传的条件时,可以设置一个全局标志位,并在回调外定期检查此标志位,一旦发现需要终止,则主动调用类似aos_http_request_abort(如果libcurl版本支持)来尝试中断HTTP请求。但请注意,这种方法依赖于底层库的具体实现,可能不是所有情况下都能保证“优雅”。

  • 另一个策略是利用线程同步机制(如互斥锁、条件变量)来协调上传任务的启动与停止,但这会增加程序的复杂度。

综上所述,对于C SDK的高级使用,可能需要您结合具体的应用场景做更多的定制化开发。如果这些限制对您的项目影响较大,考虑反馈给阿里云官方或者探索是否有更高级的SDK或第三方库能更好地满足您的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答