各位大牛好,最近在使用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来终止通信。但我觉得不够优雅,希望有大牛来指点指点。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
针对您的问题,我将分两部分进行解答:
在阿里云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;
}
注意,上述代码是一个基础示例,实际应用中您需要根据自己的需求调整,比如错误处理、资源管理等。
在OSS C SDK中,优雅地终止一个正在进行的上传操作确实比较棘手,因为标准接口不直接支持取消操作。一种可能的方案是在您的业务逻辑层面上控制,比如在进度回调中检测到应终止上传的条件时,可以设置一个全局标志位,并在回调外定期检查此标志位,一旦发现需要终止,则主动调用类似aos_http_request_abort(如果libcurl版本支持)来尝试中断HTTP请求。但请注意,这种方法依赖于底层库的具体实现,可能不是所有情况下都能保证“优雅”。
另一个策略是利用线程同步机制(如互斥锁、条件变量)来协调上传任务的启动与停止,但这会增加程序的复杂度。
综上所述,对于C SDK的高级使用,可能需要您结合具体的应用场景做更多的定制化开发。如果这些限制对您的项目影响较大,考虑反馈给阿里云官方或者探索是否有更高级的SDK或第三方库能更好地满足您的需求。