对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。

问题一:【OSS 新版C++ SDK BUG】C++使用阿里云OSS SDK时,遍历OSS上的文件时崩溃


最新版的C++SDK我是在阿里云文档页面下载的。

2023-10-20号下载的当时的版本是1.9.0,现在去下也是1.9.0

但是github上,我今天看了,版本是1.9.1,最后更新时间是8月的时候。真的很迷。

看了一下更新内容,貌似也没涉及到这个。以下是他的更新内容.

fix bugs in resumable resumable upload/download.
fix conversion issue caused by locale
add CURLE_SEND_FAIL_REWIND into retryable error.
support to unencode slash in presigned url path.
The file may uploaded incompletely in unplug & plug hard disk test.
GetBukcetStatResult returns more information.
support list buckets by region.
compatible with OpenSSL 3.0.
add EnvironmentVariableCredentialsProvider.
support path style.
add RestoreInfo filed in ListObjects/ListObjectsV2 result.

暂时没时间折腾这个了。因为下载我们这边使用的是CDN所以影响不大。但还是反映一下,避免后来者踩坑里。如果真的是版本问题,看到的小伙伴如果试了1.9.1是没有问题的,记得Call一声。我们有空也升级一下。

----------以下是10月30日的内容-----------

在使用C++SDK遍历文件时,出现BUG

下图是我的OSS上的根下的文件

使用是的RAM来操作的,生成临时的STS确定是没有问题的,因为生成的STS用于上传和获取单个文件信息都是正常且没有问题的。就是遍历文件会崩溃.

下图是关键代码

上面代码中红框部分,在遍历文件时,打印输出结果如下图

可以看到绿色箭头第一次打印输出a.jpg时,是正常的,OSS上确时有这个文件,但是在第二次打印输出时"0A966B546273DF37D3CE9F9599037616"这是什么玩意,OSS上根本没这个文件,之后的遍历就开始出错,然后就崩溃了。

如果是用于老版的C++SDK是正常没有问题的。现在使用的是新版的SDK出问题了。根据结果来推测,就应该是BUG。

----------以下是10月28日前的内容-----------

环境:windows10 64位。QT5.15.2

说明,这段代码是自己之前确定没有问题,然后弄成一个函数方便自己使用的。

访问的是方式是使用ram生成临时的STS来操作。

用的最新的SDK

上传文件到oss上没有问题。

获取oss上单个文件信息没有问题。

判断oss上是否存在指定文件也没有问题

以上这些都是通过OSS的SDK实现的

因为是要遍历文件所以RAM中也已经添加了oss:ListObjects和"oss:GetObject"相应的权限都已开放

现在遇到一个问题,在C++QT中使用阿里云OSS的C++SDK进行操作OSS时。程序就崩溃了。下面是遍历代码

std::string nextMarker = "";
    bool isTruncated = false;
    do {
        /* 列举文件。*/
        ListObjectsRequest request(bucketName);
        /* 设置列举文件的最大个数为500。*/
        request.setMaxKeys(500);
        request.setPrefix(ossDirPath.toStdString());
        request.setMarker(nextMarker);
        auto outcome = client->ListObjects(request);
        // outcome.isSuccess()值为true
        if (!outcome.isSuccess()) return false;
        for (const auto& object : outcome.result().ObjectSummarys()) {
            std::cout << "object"<<",name:" << object.Key() <<",size:" << object.Size() <<",lastmodify time:" << object.LastModified() << std::endl;
            std::string ossFilePathName = object.Key();
            std::cout << ossFilePathName;
        }
        nextMarker = outcome.result().NextMarker();
        isTruncated = outcome.result().IsTruncated();
        std::cout<<isTruncated;
    } while (isTruncated);

代码我已经精简了,其它那些确定百分之百无关的代码,都已经去掉。剩下的就是上面的代码了。

我在oss上有一个目录叫ddd,在ddd目录之下有子目录和文件。而上面的代码,运行之后,会在for循环里面打印出来一个文件。之后就崩溃的图片

于是我再次把代码精减

std::string nextMarker = "";
    bool isTruncated = false;
    do {
        /* 列举文件。*/
        ListObjectsRequest request(bucketName);
        /* 设置列举文件的最大个数为500。*/
        request.setMaxKeys(500);
        request.setPrefix(ossDirPath.toStdString());
        request.setMarker(nextMarker);
        auto outcome = client->ListObjects(request);
        // outcome.isSuccess()值为true
        if (!outcome.isSuccess()) return false;
        nextMarker = outcome.result().NextMarker();
        isTruncated = outcome.result().IsTruncated();
        std::cout<<isTruncated;
    } while (isTruncated);

依然崩溃,只是没有上一次的弹出提示而已了,是直接崩溃

再次精减代码

std::string nextMarker = "";
    bool isTruncated = false;
    do {
        /* 列举文件。*/
        ListObjectsRequest request(bucketName);
        /* 设置列举文件的最大个数为500。*/
        request.setMaxKeys(500);
        request.setPrefix(ossDirPath.toStdString());
        request.setMarker(nextMarker);
        auto outcome = client->ListObjects(request);
    } while (isTruncated);

依然无提示直接崩溃。

断点调试到这一句auto outcome = client->ListObjects(request);不会进入到while就直接崩溃了

client是百分之百实例化了的,不然上传和查看文件这些操作肯定都会报错

// 初始化OSS网络
    InitializeSdk();
    client = new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken, conf);

所以现在不知道是什么问题了。有大佬能给出个提示什么的吗?

额外再问个其它的问题

SDK中例子有这代码

/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();

这个EnvironmentVariableCredentialsProvider是什么意思,一直说从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这个环境变量在哪里配置?找到与EnvironmentVariableCredentialsProvider相关的信息也不明白他说的“请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。”

卡在这里面了


参考回答:

从你提供的截图来看,似乎是在遍历OSS上的文件时出现了问题。这可能是因为OSS C++ SDK的一个bug导致的。我建议你尝试以下几种解决方法:

  1. 更新到最新版本的OSS C++ SDK。如果你已经在使用最新版本,那么可以尝试回退到一个之前的版本,看看问题是否得到解决。
  2. 检查你的代码,确保你没有在处理文件时出现错误。例如,确保你在遍历文件时使用了一个有效的prefix参数,并且你已经正确设置了maxKeys和marker参数。
  3. 如果你无法确定问题的原因,你可以尝试使用阿里云的OSS控制台来手动列出OSS上的文件。这样可以帮助你更好地理解问题出在哪里。


关于本问题的更多回答可点击原文查看:/ask/564396


问题二:导入最新的Aliyun.OSS.dll,Unity2020编辑器运行正常,android运行报错

 

1.导入最新的Aliyun.OSS.dll

2.将Unity-Player-Other Settings设置

Api Compatibillity Level* = .NET 4.X

编辑器下运行正常

3.导出android包以后,运行报错

2023-10-23 18:57:24.372 29533-29619/? D/xiaoyuan: getUpdateCycle start

2023-10-23 18:57:24.378 29426-29730/? I/Unity: -----------------下载文件出错:System.NullReferenceException: Object reference not set to an instance of an object.

at Aliyun.OSS.Common.Communication.HttpExtensions.AddInternal (System.Net.WebHeaderCollection headers, System.String key, System.String value) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.HttpFactory.SetRequestHeaders (System.Net.HttpWebRequest webRequest, Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.ClientConfiguration configuration) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.HttpFactory.CreateWebRequest (Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.ClientConfiguration configuration) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.ServiceClientImpl.SendCore (Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.Communication.ExecutionContext context) [0x00000] i

2023-10-23 18:57:24.392 1553-2442/? D/GameManagerService: respondWithJson. command: get_sysfs_data


参考回答:

原因:

1.通过查看源码增加打印测试得知,在android环境中,Environment.OSVersion.Platform识别成了

Environment.OSVersion.Platform=PlatformID.Unix;

最后导致

_isMonoPlatform = MonoPlatforms.Contains(Environment.OSVersion.Platform);

_isMonoPlatform = true;

后续的赋值导致_addInternalMethod = null;

解决方案:

1.注释HttpExtensions.MonoPlatforms变量中的PlatformID.Unix

2.选中 aliyun-oss-sdk项目重新生成dll

3.拷贝 D:\unityWork\aliyun-oss-csharp-sdk-2.13.0\sdk\bin\Debug\Aliyun.OSS.dll覆盖到项目中

4.出android包测试成功


关于本问题的更多回答可点击原文查看:/ask/563018


问题三:Unity2020打包android包后,运行Aliyun.OSS.dll失败


1.将Unity-Player-Other Settings设置

Api Compatibillity Level* = .NET 4.X

在编辑器上运行相关代码从阿里云桶中下载文件,正常没有任何问题

2.将项目打包出android运行之后,报错如下

2023-10-20 20:50:52.373 1553-2042/? I/WifiStateMachine: checkScoreBasedQuality - mPreviousScore[0]:92 mPreviousScore[1]:93 mPreviousScore[2]:94 s2Score:94mPrevoiusScoreAverage:93

2023-10-20 20:50:52.385 11799-11893/? E/Unity: NullReferenceException: Object reference not set to an instance of an object.

at Aliyun.OSS.Common.Communication.HttpExtensions.AddInternal (System.Net.WebHeaderCollection headers, System.String key, System.String value) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.HttpFactory.SetRequestHeaders (System.Net.HttpWebRequest webRequest, Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.ClientConfiguration configuration) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.HttpFactory.CreateWebRequest (Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.ClientConfiguration configuration) [0x00000] in <00000000000000000000000000000000>:0

at Aliyun.OSS.Common.Communication.ServiceClientImpl.SendCore (Aliyun.OSS.Common.Communication.ServiceRequest serviceRequest, Aliyun.OSS.Common.Communication.ExecutionContext context) [0x00000] in <00000000000000000000000000000000>:0

at

2023-10-20 20:50:52.386 657-14296/? D/qc_adm: ns 3524636 > expected_ns 3000000 (skipped 3)

2023-10-20 20:50:52.406 657-14296/? D/qc_adm: ns 3516251 > expected_ns 3000000 (skipped 3)

2023-10-20 20:50:52.414 657-14296/? D/qc_adm: ns 3500157 > expected_ns 3000000 (skipped 3)

2023-10-20 20:50:52.436 1030-1208/? D/DnsProxyListener: DNSDBG::dns addrinfo af 2


参考回答:

Unity2020打包android包后,运行Aliyun.OSS.dll失败的可能原因有以下几种:

  • Aliyun.OSS.dll文件不兼容或缺少依赖。可以尝试官网载最新版本的SDK,并将Aliyun.OSS.dll文件放入Unity项目中。也可以检查是否安装了Newtonsoft.Json.dll和log4net.dll等依赖库。
  • Unity的Gradle模板配置不正确。需要在Unity的安装目录下,找到PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/baseProjectTemplate.gradle文件,并修改其中的repositories部分,将google()和jcenter()替换为阿里云的源。


关于本问题的更多回答可点击原文查看:/ask/562672


问题四:在使用 oss服务编译出现的error


使用oss,sdk源码编译,环境以及sdk版本如下

-- Project version: 1.9.0

-- TARGET_OS: LINUX

-- Configuring done

-- Generating done

编译过程出现

/usr/bin/ld: ../lib/libalibabacloud-oss-cpp-sdk.a(ResumableCopier.cc.o): undefined reference to symbol 'pthread_create@@GLIBC_2.17'

/usr/bin/ld: /lib/aarch64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

目前没有找到解决办法,不知道有没有人也遇到过


参考回答:

这个错误信息表明在你的系统中缺少一个名为"libpthread.so.0"的库文件,这是Linux系统中一个重要的线程库文件。可能是你的系统没有安装这个库,或者你的库文件版本与你正在使用的其他库文件不兼容。

你可以尝试以下步骤来解决这个问题:

  1. 检查你的系统,确保你已经安装了"libpthread.so.0"库文件。如果没有,你可以使用你的系统的包管理器(例如,Ubuntu系统的apt,CentOS系统的yum)来安装这个库。
  2. 如果你已经安装了"libpthread.so.0"库文件,但是你的库文件版本与你正在使用的其他库文件不兼容,你可能需要更换一个版本的库文件。
  3. 如果你确定你的系统和库文件都没有问题,但是编译时仍然出现这个错误,你可能需要查看SDK的编译选项,确保所有必要的库文件和头文件都被正确地链接了。


关于本问题的更多回答可点击原文查看:/ask/559150


问题五:阿里云追加上传 ObjectMetadata 中 自定义参数userMetadata设置问题

 

问题描述

使用阿里云appendObject 追加上传时 ObjectMetadata 中的 userMetadata 中自定义的参数在首次上传设置时有效 追加上传更新 userMetadata 参数时 更新不成功

期望结果

追加上传可以更新userMetadata中自定义参数

已尝试的方法

...


参考回答:

你好,目前暂不支持追加上传更新元信息,详情可参考:https://help.aliyun.com/document_detail/84784.html

若您想修改文件元信息可在文件上传成功后单独进行元信息的修改,具体可参考:https://help.aliyun.com/document_detail/84840.html#section-7wq-ouw-jbx


关于本问题的更多回答可点击原文查看:/ask/502320

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
5天前
|
分布式计算 大数据 MaxCompute
MaxCompute产品使用合集之使用pyodps读取OSS(阿里云对象存储)中的文件的步骤是什么
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4天前
|
数据采集 数据安全/隐私保护 C++
通过C++和libcurl下载网易云音乐音频文件的5个简单步骤
本文将介绍如何通过C和libcurl库下载网易云音乐的音频文件。我们将通过5个简单步骤完成这个任务,同时会使用爬虫代理IP技术来绕过这些网络限制,确保下载的顺利进行。为此,我们将参考爬虫代理的域名、端口、用户名和密码进行设置。网易云音乐作为一个不断发展的音乐平台,其丰富的资源和智能化服务将持续吸引大量用户,而掌握如上所述的下载技巧也将助力开发者更好地利用这些资源。
通过C++和libcurl下载网易云音乐音频文件的5个简单步骤
|
5天前
|
存储 Serverless 对象存储
通过FC运行脚本下载文件到OSS
本文介绍了在阿里云中使用函数计算服务(Function Compute)从URL下载文件并存储到OSS(Object Storage Service)的步骤。首先,需开通函数计算服务并创建RAM角色,授权函数计算访问OSS权限。费用详情参考官方计费概述。操作步骤包括:登录OSS控制台,使用公共模板创建执行,配置参数并运行Python脚本,脚本负责从URL下载文件并上传至指定OSS Bucket。执行成功后,文件将出现在目标OSS Bucket中。
40 0
|
5天前
|
C++ 数据格式
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
|
5天前
|
分布式计算 Java 大数据
MaxCompute产品使用合集之大数据计算MaxCompute外部表映射了oss中的csv文件,看到"\N"被解析为"N",是什么原因
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5天前
|
运维 Java Serverless
Serverless 应用引擎产品使用之数据文件(例如sdxl)超过了OSS(对象存储服务)的单个上传大小限制(5GB)如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
24 1
|
5天前
|
SQL 消息中间件 存储
对象存储OSS产品常见问题之恢复文件覆盖如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
46 0
|
Web App开发 JavaScript PHP
【视频点播最佳实践】使用OSS SDK上传视频到点播
场景 点播上传SDK缺乏需要的语言版本(如C/C++、Go等)或相应的功能(如网络流上传、追加上传),可以直接使用OSS的SDK进行上传。 准备工作 确认已开通点播服务并完成了相关配置。确认已准备了阿里云账号AK,并授予了上传权限。
9655 0
|
5天前
|
机器学习/深度学习 存储 分布式计算
机器学习PAI常见问题之DLC的数据写入到另外一个阿里云主账号的OSS中如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
5天前
|
安全 Linux 对象存储
数据备份到阿里云oss上,以防勒索病毒的破坏
数据备份到阿里云oss上,以防勒索病毒的破坏
21 0

热门文章

最新文章

相关产品

  • 对象存储
  • http://www.vxiaotou.com