使用OSS-c-sdk上传,在ARM上返回结果成功,后台查看文件大小为零;有时http会返回乱码。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,使用OSS C SDK在ARM平台上上传文件时,返回结果成功,但后台查看文件大小为零,同时HTTP响应有时会返回乱码。结合知识库中的参考资料,可以初步判断问题可能与以下因素相关:
MemoryStream
或类似结构),可能存在指针未正确重置的情况,导致上传的内容为空。如果上传的文件内容来源于内存缓冲区(如aos_buf_t
或类似结构),需要确保指针位置正确。参考知识库中关于MemoryStream
的解决方案,建议在上传前将指针重置到起始位置。以下是具体操作步骤:
MemoryStream
的结构,需在上传前调用指针重置操作。例如:
aos_buf_t *content = NULL;
content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
确保object_content
指向的数据是有效的,并且指针位置正确。
HTTP响应返回乱码可能是由于编码问题或解析逻辑错误导致的。建议采取以下措施:
检查响应头编码:确保HTTP响应头的编码与实际内容一致。可以通过打印响应头信息进行验证:
printf("Response headers:\n");
aos_table_t *resp_headers = NULL;
aos_table_do_foreach(resp_headers, print_header, NULL);
其中print_header
是一个自定义函数,用于逐行打印响应头内容。
验证SDK版本:确保使用的OSS C SDK版本是最新的,避免因旧版本的Bug导致解析异常。
ARM平台可能存在与x86平台不同的编译或运行环境,建议从以下方面排查:
-march=armv8-a
等选项以适配ARM架构。OSS默认开启了CRC校验机制,用于确保上传文件的完整性。如果文件大小为零,可能是上传过程中数据丢失导致的。建议启用CRC校验并捕获异常:
options->ctl->options->enable_crc = AOS_TRUE;
InconsistentError
异常,并根据异常信息定位问题。以下是一个经过调整的示例代码,确保文件指针位置正确并启用CRC校验:
#include "oss_api.h"
#include "aos_http_io.h"
int main() {
aos_pool_t *pool = NULL;
aos_status_t *resp_status = NULL;
aos_string_t bucket;
aos_string_t object;
aos_list_t buffer;
aos_buf_t *content = NULL;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
// 初始化内存池
aos_pool_create(&pool, NULL);
// 设置Bucket和Object名称
aos_str_set(&bucket, "examplebucket");
aos_str_set(&object, "exampledir/exampleobject.txt");
// 初始化缓冲区
aos_list_init(&buffer);
const char *object_content = "More than just cloud.";
content = aos_buf_pack(pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
// 启用CRC校验
oss_request_options_t *options = oss_request_options_create(pool);
options->ctl->options->enable_crc = AOS_TRUE;
// 上传文件
resp_status = oss_put_object_from_buffer(options, &bucket, &object, &buffer, headers, &resp_headers);
// 判断上传是否成功
if (aos_status_is_ok(resp_status)) {
printf("Put object from buffer succeeded\n");
} else {
printf("Put object from buffer failed, error code: %d\n", resp_status->code);
}
// 释放资源
aos_pool_destroy(pool);
return 0;
}
如果问题仍未解决,请提供更多上下文信息(如完整代码、日志输出等),以便进一步分析。