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…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...