从本地文件追加数据到OSS
通过oss_append_object_from_file接口,并指定fliepath参数, 可以实现将一个本地文件的数据追加到OSS:
void append_object_from_file()
{
aos_pool_t *p = NULL;
aos_string_t bucket;
aos_string_t object;
aos_table_t *headers1 = NULL;
aos_table_t *headers2 = NULL;
aos_table_t *resp_headers = NULL;
oss_request_options_t *options = NULL;
char *filename = __FILE__;
aos_status_t *s = NULL;
aos_string_t file;
int64_t position = 0;
char *next_append_position = NULL;
aos_pool_create(&p, NULL);
/* 创建并初始化options */
options = oss_request_options_create(p);
init_options(options);
/* 初始化参数 */
headers1 = aos_table_make(options->pool, 0);
headers2 = aos_table_make(options->pool, 0);
aos_str_set(&bucket, "<您的bucket名字>");
aos_str_set(&object, "<您的object名字>");
aos_str_set(&file, filename);
/* 获取起始追加位置 */
s = oss_head_object(options, &bucket, &object, headers1, &resp_headers);
if(aos_status_is_ok(s)) {
next_append_position = (char*)(apr_table_get(resp_headers,
"x-oss-next-append-position"));
position = atoi(next_append_position);
}
/* 追加文件 */
s = oss_append_object_from_file(options, &bucket, &object,
position, &file, headers2, &resp_headers);
/* 判断是否追加成功 */
if (aos_status_is_ok(s)) {
printf("append object from file succeeded\n");
} else {
printf("append object from file failed\n");
}
/* 释放资源*/
aos_pool_destroy(p);
}
[backcolor=transparent]注:
- 不能对一个非Appendable Object进行Append Object操作。例如,已经存在一个同名Normal Object时,Append Object调用返回409,错误码ObjectNotAppendable。
- 对一个已经存在的Appendable Object进行Put Object操作,那么该Appendable Object会被新的Object覆盖,类型变为Normal Object。
- Head Object操作会返回x-oss-object-type,用于表明Object的类型。对于Appendable Object来说,该值为Appendable。对Appendable Object,Head Object也会返回上述的x-oss-next-append-position和x-oss-hash-crc64ecma。
- 不能使用Copy Object来拷贝一个Appendable Object,也不能改变它的服务器端加密的属性。可以使用Copy Object来改变用户自定义元信息。
- 完整代码参考:GitHub
void resumable_upload()
{
aos_pool_t *p = NULL;
aos_string_t bucket;
aos_string_t object;
aos_string_t filename;
aos_status_t *s = NULL;
int is_cname = 0;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_list_t resp_body;
oss_request_options_t *options = NULL;
oss_resumable_clt_params_t *clt_params;
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_sample_request_options(options, is_cname);
headers = aos_table_make(p, 0);
aos_str_set(&bucket, BUCKET_NAME);
aos_str_set(&object, "my_key.zip");
aos_str_set(&filename, "local_big_file.zip");
aos_list_init(&resp_body);
// 断点续传
clt_params = oss_create_resumable_clt_params_content(p, 1024 * 100, 3, AOS_TRUE, NULL);
s = oss_resumable_upload_file(options, &bucket, &object, &filename, headers, NULL,
clt_params, NULL, &resp_headers, &resp_body);
if (aos_status_is_ok(s)) {
printf("upload succeeded\n");
} else {
printf("upload failed\n");
}
aos_pool_destroy(p);
}
[backcolor=transparent]注:
- 断点续传上传支持设置元信息、上传回调、进度条功能。
- 完整代码参考:GitHub。
void test_upload_file()
{
aos_pool_t *p = NULL;
aos_string_t bucket;
aos_string_t object;
oss_request_options_t *options = NULL;
aos_status_t *s = NULL;
int part_size = 100 * 1024;
aos_string_t upload_id;
aos_string_t filepath;
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名字>");
aos_str_null(&upload_id);
aos_str_set(&filepath, __FILE__);
/* 分片上传 */
s = oss_upload_file(options, &bucket, &object, &upload_id, &filepath,
part_size, NULL);
/* 判断是否上传成功 */
if (aos_status_is_ok(s)) {
printf("upload file succeeded\n");
} else {
printf("upload file failed\n");
}
/* 释放资源*/
aos_pool_destroy(p);
}
[backcolor=transparent]注:
- 使用oss_upload_file进行分片上传文件操作,如果是一个新的分片上传操作,设置upload_id为NULL,可以通过aos_str_null(&upload_id)实现;如果是对一个已经存在的upload_id进行续传操作,设置upload_id为指定的upload_id_str,可以通过aos_str_set(&upload_id, upload_id_str)实现。
- 使用oss_upload_file进行分片上传文件操作时,需要指定分片大小, 分片大小要大于100KB。分片号码的范围是1~10000,如果在切分文件时,发现分片号码的范围超出这个范围,oss_upload_file将自动调整分片大小。
- 使用oss_upload_file进行分片上传文件操作,如果指定的upload_id已经存在,那么本次分片上传的分片大小要和指定upload_id的分片大小保持一致。
- 完整代码参考:GitHub
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。