Qt案例-编译阿里云OSS对象存储C++ SDK源码,并进行简单下载,上传数据,显示进度等相关功能
项目中用到了阿里云OSS对象存储来保存数据,由于以前没用过这个库,就下载了C++版的sdk源码重新编译了一次,并使用Qt调用;不得不说这可能是我编译源码最轻松的一次。
目录标题
- 简述
- OSS图形化管理工具
- 编译源码
- Qt 添加引用
- 常用 Endpoint
- 使用方法
- 上传示例:
- 直接读取OSS下载缓存,不写入文件:
- 进度下载:
- 测试时遇到的两个问题
- 添加<windows.h>头文件时无法识别外部链接GetObjectW
- 在添加进度条下载功能时,静态方法发送信号
简述
阿里云对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。用户可以通过调用API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过用户Web控制台对数据进行简单的管理。OSS适合存放任意文件类型,适合各种网站、开发企业及开发者使用。
适用于阿里云OSS的 C++ SDK提供了一组现代化的 C++(C++ 11)接口,让您不用复杂编程即可访问阿里云OSS服务。
如果您在使用SDK的过程中遇到任何问题,欢迎前往阿里云SDK问答社区提问,提问前请阅读提问引导:
阿里云OSS C++工具套件
直接下载C++版SDK
通过GitHub下载
OSS图形化管理工具
ossbrowser是阿里云官方提供的OSS图形化管理工具,提供类似Windows资源管理器的功能
OSS图形化管理工具 直接下载【oss-browser-win32-x64】
阿里云产品文档-安装并登录ossbrowser
编译源码
OSS的SDK只有少数的几个配置项,直接默认生成就行,如果需要配置,可以查看 CMAKE 选项

生成以下文件:

使用vs打开alibabacloud-oss-cpp-sdk.sln重新生成cpp-sdk:

Qt 添加引用
Qt 调用需要把 SDK中的文件夹放在项目目录下,并添加引用

# 动态库链接
# /OSS/include 路径中oss为新建文件夹
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/OSS/lib/Release/ -lalibabacloud-oss-cpp-sdk
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/OSS/lib/Debug/ -lalibabacloud-oss-cpp-sdkINCLUDEPATH += $$PWD/OSS/include
DEPENDPATH += $$PWD/OSS/include
同时需要把third_party中的dll添加进去

//注意64位与32位应选择不同文件夹
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -llibeay32
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -llibeay32win32:CONFIG(release, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -lssleay32
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -lssleay32win32:CONFIG(release, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -llibcurl
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -llibcurl
常用 Endpoint
在调用oss库时,看一遍说明文档是必要的,就比如Endpoint 这个参数费半天的劲猜对,才发现有详细说明C++初始化;
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;///地区
QMap<QString,QString> Mapdata;Mapdata.insert("华东1(杭州)","oss-cn-hangzhou.aliyuncs.com");Mapdata.insert("华东2(上海)","oss-cn-shanghai.aliyuncs.com");Mapdata.insert("华东5(南京-本地地域)","oss-cn-nanjing.aliyuncs.com");Mapdata.insert("华北1(青岛)","oss-cn-qingdao.aliyuncs.com");Mapdata.insert("华北2(北京)","oss-cn-beijing.aliyuncs.com");Mapdata.insert("华北3(张家口)","oss-cn-zhangjiakou.aliyuncs.com");Mapdata.insert("华北5(呼和浩特)","oss-cn-huhehaote.aliyuncs.com");Mapdata.insert("华北6(乌兰察布)","oss-cn-wulanchabu.aliyuncs.com");Mapdata.insert("华南1(深圳)","oss-cn-shenzhen.aliyuncs.com");Mapdata.insert("华南2(河源)","oss-cn-heyuan.aliyuncs.com");Mapdata.insert("华南3(广州)","oss-cn-guangzhou.aliyuncs.com");Mapdata.insert("西南1(成都)","oss-cn-chengdu.aliyuncs.com");int main(void)
{/* yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/std::string Endpoint = "yourEndpoint";/* 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。*/std::string AccessKeyId = "yourAccessKeyId";std::string AccessKeySecret = "yourAccessKeySecret";/* 从STS服务获取的安全令牌(SecurityToken)。*/std::string SecurityToken = "yourSecurityToken";/* 初始化网络等资源。*/InitializeSdk();ClientConfiguration conf;OssClient client(Endpoint, AccessKeyId, AccessKeySecret, SecurityToken, conf); /* 释放网络等资源。*/ShutdownSdk();return 0;
}
使用方法
OSS C++ SDK提供丰富的示例代码
在OSS C++ SDk中ObjectSample.h文件提供了大多数方法的调用示例,

如:

上传示例:
//PutObjectFromFile()
qDebug()<<"[__FILE__] "<<__FILE__;
QFileInfo info("E:\\LOCAL_FTP\\archival-information.xml");
qDebug()<<info.exists();
std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(info.absoluteFilePath().toStdString(), std::ios::in | std::ios::binary);
PutObjectRequest request(bucket_, info.fileName().toStdString(), content);
auto outcome = client->PutObject(request);
if (outcome.isSuccess()) {std::cout << __FUNCTION__ << " success, ETag:" << outcome.result().ETag() << std::endl;
}
else {PrintError(__FUNCTION__, outcome.error());
}
直接读取OSS下载缓存,不写入文件:
// 初始化SDK
InitializeSdk();QString Data_XML="";ClientConfiguration conf;OssClient* client = new OssClient(OSS_Config::OSS_Endpoint, OSS_Config::OSS_AccessKeyId, OSS_Config::OSS_AccessKeySecret, conf);{std::shared_ptr<std::stringstream> content = std::make_shared<std::stringstream>();GetObjectRequest request(OSS_Config::OSS_Buckets, OSS_Path.toStdString());request.setResponseStreamFactory([=](){return content;});auto outcome = client->GetObject(request);if (outcome.isSuccess()) {Data_XML=QString::fromStdString(content->str());}else {OSS_Config::instance().PrintError(__FUNCTION__, outcome.error());}}// 关闭SDKShutdownSdk();
进度下载:
当通过线程进行下载时注意 通过ProgressCallback方法获取下载的进度显示,需要注意的是ProgressCallback方法必须为静态方法,
static void ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData)
{std::cout << "ProgressCallback[" << userData << "] => " <<increment <<" ," << transfered << "," << total << std::endl;
}{DownloadObjectRequest request(bucket_, "xxx.pdf", Config::FileDownloadTo, "", 100*1024, 0 );TransferProgress progressCallback = { ProgressCallback , this };request.setTransferProgress(progressCallback);auto outcome = client->ResumableDownloadObject(request);if (outcome.isSuccess()) {std::cout << __FUNCTION__ << "[" << this << "]" << " success, ETag:" << outcome.result().Metadata().ETag() << std::endl;}else {PrintError(__FUNCTION__, outcome.error());}
}
测试时遇到的两个问题
添加<windows.h>头文件时无法识别外部链接GetObjectW
添加<windows.h>头文件时,会提示无法识别外部链接GetObjectW的问题此时只需要:
添加3个undef语句,避免了调用OSS::GetObject时编译报错
#include <Windows.h>
#undef GetObject
#undef GetObjectW
#undef GetObjectA
阿里云OSS C++SDK在VS15编译提示无法识别外部链接GetObjectW的解决办法
在添加进度条下载功能时,静态方法发送信号
当测试下载进度时,需要ProgressCallback方法中发送信号,而ProgressCallback方法是个静态方法,解决方法是在ProgressCallback中调用个单例类来单独发送信息,而这个单例类与线程类绑定信号;下载的暂停同样是在ProgressCallback中实现。

相关文章:
Qt案例-编译阿里云OSS对象存储C++ SDK源码,并进行简单下载,上传数据,显示进度等相关功能
项目中用到了阿里云OSS对象存储来保存数据,由于以前没用过这个库,就下载了C版的sdk源码重新编译了一次,并使用Qt调用;不得不说这可能是我编译源码最轻松的一次。 目录标题 简述OSS图形化管理工具编译源码Qt 添加引用常用 Endpoint…...
JAVA异常输出到控制台
在处理异常时,可以根据情况选择使用 e.getMessage()、e.toString() 或 e.printStackTrace() 来获得或打印异常相关信息。 e.printStackTrace() 是 Java 中用于打印异常堆栈跟踪信息的方法。当出现异常时,可以调用 e.printStackTrace() 将异常信息输出到控…...
html5学习笔记23-vue 简略学习,未完
https://www.runoob.com/vue3/vue3-tutorial.html Vue.js是一套构建用户界面的渐进式框架。Vue 只关注视图层, 采用自底向上增量开发的设计。 https://unpkg.com/vuenext https://unpkg.com/vue3.2.36/dist/vue.global.js <script src"https://cdn.staticf…...
【Fiddler】mac m1 机器上使用 fiddler 抓取接口
mac m1 机器上使用 fiddler 抓取接口(非虚拟机模式) author: jwensh date:2023.09.12 文章目录 mac m1 机器上使用 fiddler 抓取接口(非虚拟机模式)1. 环境准备2. 进行配置3. 使用情况 1. 环境准备 想要抓取 mac 上浏览器的接口&a…...
Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项
在过去的一年里,我发现苹果系统中的“文字搜图片”功能非常好用,这个功能不光 iPhone/iPad,Mac 也有,找一些图片真的很好用。但是遇到了一个问题:这个功能需要一段时间才能找到新的图片,而且没法手动刷新&a…...
c++ 学习 之 常函数 和 常对象
前言 常函数 成员函数后加 const 我们可以称这个函数为 常函数 常函数内不可以修改成员属性 成员属性声明时加关键字 mutable 后,在常函数中依然可以修改 常对象 常对象 声明对象前加 const 称该对象为常对象 常对象只能调用常函数 正文 常函数 class Person…...
LLM - 批量加载 dataset 并合并
目录 一.引言 二.Dataset 生成 1.数据样式 2.批量加载 ◆ 主函数调用 ◆ 基础变量定义 ◆ 多数据集加载 3.数据集合并 ◆ Concat ◆ interleave ◆ stopping_strategy ◆ interleave_probs 三.总结 一.引言 LLM 模型基于 transformer 进行训练,需要先…...
Debian 初始化命令备忘
本文地址:blog.lucien.ink/archives/541 以 Debian 11 为例,主要用于备忘。 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non…...
二维矩阵的DFS算法框架
二维矩阵的DFS算法框架 关于岛屿的相似题目: 岛屿数量 – 二维矩阵的dfs算法封闭岛屿数量 – 二维矩阵的dfs算法统计封闭岛屿的数目统计子岛屿不同岛屿的数量 # 二叉树遍历框架 def traverse(root):if not root:return # 前序遍历traverse(root.left)# 中序遍历t…...
pytest实现日志按用例输出到指定文件中
场景 执行自动化用例时,希望日志按用例生成一个文件,并且按用例所在文件生成目录,用例失败时便于查看日志记录 实现方式 pytest.ini文件 在pytest.ini配置文件中设置配置项(定义日志输出级别和格式) log_clitrue l…...
程序员面试逻辑题
红白帽子推理 答案: 这个题有点像数学归纳法,就是假设有 A A A和 B B B两个人是黑色的帽子,这样的话第一次开灯, A A A看到 B B B是黑色的,其他人都是白色的,那么 A A A会觉得 B B B是那个黑色的࿰…...
自动创建设备节点udev机制实现
自动创建设备节点udev机制实现过程: 1.当插入设备,内核会向udev发送一个事件,其中包含着设备的信息。 2.udev会根据收到的设备信息匹配相应的规则文件。 3.udev会根据规则文件中的配置,创建一个唯一的设备节点文件。通常存储在/d…...
目标检测YOLO实战应用案例100讲-基于小样本学习和空间约束的濒危动物目标检测
目录 前言 相关技术介绍 2.1 卷积神经网络 2.1.1 基本结构 2.1.2 网络训练...
苹果数据恢复软件:Omni Recover Mac
Omni Recover是一款十分实用的Mac数据恢复软件,为用户提供了简单、安全、快速和高效的数据恢复服务。如果您遇到了Mac或iOS设备中的数据丢失和误删情况,不要着急,不妨尝试一下Omni Recover,相信它一定会给您带来惊喜。 首先&…...
树回归CART
之前线性回归创建的模型需要拟合所有的样本点,但数据特征众多,关系复杂时,构建全局模型就很困难。之前构建决策树使用的算法是ID3。 ID3 的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说&…...
zemax色差与消色差
色差,颜色像差 轴向色差:不同波长的光束通过透镜后焦点位于沿轴的不同位置 垂轴色差:每个波长成像的放大率不同 单透镜为例: 输入需要设置为多波长 观察光线光扇图: 不同波长的光之间差异较大(不同颜色…...
成绩定级脚本(Python)
成绩评定脚本 写一个成绩评定的python脚本,实现用户输入成绩,由脚本来为成绩评级: #成绩评定脚本.pyscoreinput("please input your score:") if int(score)> 90:print("A") elif int(score)> 80:print("B&…...
骨传导耳机的危害有哪些?会损害听力吗?
如果正常的使用,骨传导耳机是没有危害的,由于骨传导耳机独特的传声方式,所以并不会对人体造成损伤,还可以在一定程度上保护听力。 如果想更具体知道骨传导耳机有什么危害,就要先了解什么是骨传导耳机,骨传…...
Redis模块二:缓存分类 + Redis模块三:常见缓存(应用)
缓存大致可以分为两大类:1)本地缓存 2)分布式缓存 目录 本地缓存 分布式缓存 常见缓存的使用 本地缓存:Spring Cache 分布式缓存:Redis 本地缓存 本地缓存也叫单机缓存,也就是说可以应⽤在单机环…...
Revit SDK 内容摘要: 8.0 -8.1
前提 不包含已单独写博客部分。 Revit SDK Samples 8.0 AnalyticalViewer 分析模型,VB,略。 namespace Autodesk.Revit.DB.Structure {public class AnalyticalModel : Element{public AnalyticalRigidLinksOption RigidLinksOption { get; set; }p…...
Ollama部署translategemma-4b-it企业级运维:Prometheus监控+告警配置
Ollama部署translategemma-4b-it企业级运维:Prometheus监控告警配置 1. 项目背景与价值 在企业级应用环境中,AI翻译服务的稳定性和可靠性至关重要。translategemma-4b-it作为Google基于Gemma 3构建的轻量级翻译模型,支持55种语言的互译任务…...
cocos2d-x手游防护全攻略:从lua加密到opcode混淆的5种实战方案
Cocos2d-x手游防护实战:从脚本加密到虚拟机定制的五层纵深防御体系 在移动游戏开发领域,Cocos2d-x凭借其跨平台特性和对Lua脚本语言的良好支持,成为了众多中重度手游的首选引擎。然而,随着游戏市场的竞争白热化,游戏逻…...
ai辅助排错:让快马平台的智能助手帮你解决openclaw本地安装中的各种疑难杂症
最近在本地安装OpenClaw时,遇到了不少麻烦。从环境配置、依赖冲突到脚本执行报错,每一步都可能卡住,尤其是对于不熟悉Linux系统或Python生态的开发者来说,查文档、搜论坛的过程既耗时又低效。这时候,如果能有一个懂技术…...
深入解析sysmocom eUICC:从硬件架构到eSIM配置管理
1. 从物理芯片到虚拟身份:eUICC到底是什么? 如果你拆开过最近几年的新款手机、智能手表,或者一些物联网设备,可能会发现一个有趣的现象:那个熟悉的SIM卡槽不见了。取而代之的,是一个直接焊接在主板上的小芯…...
(104页PPT)DG1067全面企业绩效管理(附下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 (104页PPT)DG1067全面企业绩效管理.pptx_IT运维服务质量评价体系资源-CSDN下载 资料解读:(104 页)DG1067 全面企业绩效管理 详细资料请…...
内存涨价、供应不稳?嵌入式工程师必看:适合轻量级项目ARM选型与存储避坑指南
在嵌入式开发的圈子里,很多工程师都经历过这种“阵痛”: 原本用得好好的高性能单片机(MCU),随着项目需求的增加——要接个高分辨率屏、要做个复杂的协议转换、要跑个轻量级语音识别,或者要处理多路音频流—…...
CLI-Anything 实战评测
CLI-Anything 实战评测:给 GIMP 生成 CLI 接口,Agent 操控专业软件的新思路本文基于实际使用和源码调试,分析 CLI-Anything 项目的技术实现、存在的问题及适用场景。背景 最近 GitHub 上有个叫 CLI-Anything 的项目(https://githu…...
效率提升秘籍:用快马AI一键生成飞牛漏洞自动化检测脚本
作为一名经常需要做内部安全测试的工程师,我深知效率的重要性。每次发现一个新的漏洞类型,比如最近关注的“飞牛漏洞”,都需要快速验证其在我们系统中的应用风险。手动编写测试脚本、构造请求、分析响应,一套流程下来,…...
GLM-4-9B-Chat-1M多模态对话:结合Whisper的语音交互
GLM-4-9B-Chat-1M多模态对话:结合Whisper的语音交互 1. 引言 想象一下,你正在厨房忙碌,手上沾满了面粉,突然想查个菜谱。传统的方式可能需要洗手、解锁手机、打开应用、输入文字...这一套流程下来,炒菜的锅都快烧干了…...
SmallThinker-3B-Preview一键部署与GitHub源码管理联动实践
SmallThinker-3B-Preview一键部署与GitHub源码管理联动实践 最近在星图GPU平台上部署了SmallThinker-3B-Preview模型,整个过程确实挺顺畅的,一键部署的体验没得说。但用了一段时间后,我发现了一个小麻烦:每次想调整一下启动参数&…...
