当前位置: 首页 > news >正文

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对象存储来保存数据&#xff0c;由于以前没用过这个库&#xff0c;就下载了C版的sdk源码重新编译了一次&#xff0c;并使用Qt调用&#xff1b;不得不说这可能是我编译源码最轻松的一次。 目录标题 简述OSS图形化管理工具编译源码Qt 添加引用常用 Endpoint…...

JAVA异常输出到控制台

在处理异常时&#xff0c;可以根据情况选择使用 e.getMessage()、e.toString() 或 e.printStackTrace() 来获得或打印异常相关信息。 e.printStackTrace() 是 Java 中用于打印异常堆栈跟踪信息的方法。当出现异常时&#xff0c;可以调用 e.printStackTrace() 将异常信息输出到控…...

html5学习笔记23-vue 简略学习,未完

https://www.runoob.com/vue3/vue3-tutorial.html Vue.js是一套构建用户界面的渐进式框架。Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 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 抓取接口&#xff08;非虚拟机模式&#xff09; author: jwensh date:2023.09.12 文章目录 mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09;1. 环境准备2. 进行配置3. 使用情况 1. 环境准备 想要抓取 mac 上浏览器的接口&a…...

Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项

在过去的一年里&#xff0c;我发现苹果系统中的“文字搜图片”功能非常好用&#xff0c;这个功能不光 iPhone/iPad&#xff0c;Mac 也有&#xff0c;找一些图片真的很好用。但是遇到了一个问题&#xff1a;这个功能需要一段时间才能找到新的图片&#xff0c;而且没法手动刷新&a…...

c++ 学习 之 常函数 和 常对象

前言 常函数 成员函数后加 const 我们可以称这个函数为 常函数 常函数内不可以修改成员属性 成员属性声明时加关键字 mutable 后&#xff0c;在常函数中依然可以修改 常对象 常对象 声明对象前加 const 称该对象为常对象 常对象只能调用常函数 正文 常函数 class Person…...

LLM - 批量加载 dataset 并合并

目录 一.引言 二.Dataset 生成 1.数据样式 2.批量加载 ◆ 主函数调用 ◆ 基础变量定义 ◆ 多数据集加载 3.数据集合并 ◆ Concat ◆ interleave ◆ stopping_strategy ◆ interleave_probs 三.总结 一.引言 LLM 模型基于 transformer 进行训练&#xff0c;需要先…...

Debian 初始化命令备忘

本文地址&#xff1a;blog.lucien.ink/archives/541 以 Debian 11 为例&#xff0c;主要用于备忘。 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算法框架 关于岛屿的相似题目&#xff1a; 岛屿数量 – 二维矩阵的dfs算法封闭岛屿数量 – 二维矩阵的dfs算法统计封闭岛屿的数目统计子岛屿不同岛屿的数量 # 二叉树遍历框架 def traverse(root):if not root:return # 前序遍历traverse(root.left)# 中序遍历t…...

pytest实现日志按用例输出到指定文件中

场景 执行自动化用例时&#xff0c;希望日志按用例生成一个文件&#xff0c;并且按用例所在文件生成目录&#xff0c;用例失败时便于查看日志记录 实现方式 pytest.ini文件 在pytest.ini配置文件中设置配置项&#xff08;定义日志输出级别和格式&#xff09; log_clitrue l…...

程序员面试逻辑题

红白帽子推理 答案&#xff1a; 这个题有点像数学归纳法&#xff0c;就是假设有 A A A和 B B B两个人是黑色的帽子&#xff0c;这样的话第一次开灯&#xff0c; A A A看到 B B B是黑色的&#xff0c;其他人都是白色的&#xff0c;那么 A A A会觉得 B B B是那个黑色的&#xff0…...

自动创建设备节点udev机制实现

自动创建设备节点udev机制实现过程&#xff1a; 1.当插入设备&#xff0c;内核会向udev发送一个事件&#xff0c;其中包含着设备的信息。 2.udev会根据收到的设备信息匹配相应的规则文件。 3.udev会根据规则文件中的配置&#xff0c;创建一个唯一的设备节点文件。通常存储在/d…...

目标检测YOLO实战应用案例100讲-基于小样本学习和空间约束的濒危动物目标检测

目录 前言 相关技术介绍 2.1 卷积神经网络 2.1.1 基本结构 2.1.2 网络训练...

苹果数据恢复软件:Omni Recover Mac

Omni Recover是一款十分实用的Mac数据恢复软件&#xff0c;为用户提供了简单、安全、快速和高效的数据恢复服务。如果您遇到了Mac或iOS设备中的数据丢失和误删情况&#xff0c;不要着急&#xff0c;不妨尝试一下Omni Recover&#xff0c;相信它一定会给您带来惊喜。 首先&…...

树回归CART

之前线性回归创建的模型需要拟合所有的样本点&#xff0c;但数据特征众多&#xff0c;关系复杂时&#xff0c;构建全局模型就很困难。之前构建决策树使用的算法是ID3。 ID3 的做法是每次选取当前最佳的特征来分割数据&#xff0c;并按照该特征的所有可能取值来切分。也就是说&…...

zemax色差与消色差

色差&#xff0c;颜色像差 轴向色差&#xff1a;不同波长的光束通过透镜后焦点位于沿轴的不同位置 垂轴色差&#xff1a;每个波长成像的放大率不同 单透镜为例&#xff1a; 输入需要设置为多波长 观察光线光扇图&#xff1a; 不同波长的光之间差异较大&#xff08;不同颜色…...

成绩定级脚本(Python)

成绩评定脚本 写一个成绩评定的python脚本&#xff0c;实现用户输入成绩&#xff0c;由脚本来为成绩评级&#xff1a; #成绩评定脚本.pyscoreinput("please input your score:") if int(score)> 90:print("A") elif int(score)> 80:print("B&…...

骨传导耳机的危害有哪些?会损害听力吗?

如果正常的使用&#xff0c;骨传导耳机是没有危害的&#xff0c;由于骨传导耳机独特的传声方式&#xff0c;所以并不会对人体造成损伤&#xff0c;还可以在一定程度上保护听力。 如果想更具体知道骨传导耳机有什么危害&#xff0c;就要先了解什么是骨传导耳机&#xff0c;骨传…...

Redis模块二:缓存分类 + Redis模块三:常见缓存(应用)

缓存大致可以分为两大类&#xff1a;1&#xff09;本地缓存 2&#xff09;分布式缓存 目录 本地缓存 分布式缓存 常见缓存的使用 本地缓存&#xff1a;Spring Cache 分布式缓存&#xff1a;Redis 本地缓存 本地缓存也叫单机缓存&#xff0c;也就是说可以应⽤在单机环…...

Revit SDK 内容摘要: 8.0 -8.1

前提 不包含已单独写博客部分。 Revit SDK Samples 8.0 AnalyticalViewer 分析模型&#xff0c;VB&#xff0c;略。 namespace Autodesk.Revit.DB.Structure {public class AnalyticalModel : Element{public AnalyticalRigidLinksOption RigidLinksOption { get; set; }p…...

列表和字典练习

定义四个学生信息 在Python环境下&#xff0c;用列表定义&#xff1a; >>> stu1[xiaoming,True,21,79.9] >>> stu1[lihong,False,22,69.9] >>> stu1[zhangqiang,True,20,89.9] >>> stu1[EMT,True,23,99.9]如图&#xff0c;定义了四个列表…...

iwebsec靶场 文件包含漏洞通关笔记2-文件包含绕过(截断法)

目录 前言 1.%00截断 2.文件字符长度截断法&#xff08;又名超长文件截断) 方法1&#xff08;路径截断法&#xff09; 方法2&#xff08;点号截断法&#xff09; 第02关 文件包含绕过 1.打开靶场 2.源码分析 3.00文件截断原理 4.00截断的条件 5.文件包含00截断绕过 …...

【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 在上一节的课程中&#xff0c;您已经实现了通过触控给刚体施…...

蓝蓝设计为教育行业提供软件UI交互设计服务

在教育行业&#xff0c;软件的用户体验设计对于提供优质教育体验至关重要。教育行业软件用户体验设计需要考虑到学生和教师的需求&#xff0c;以及教育环境的特殊性。为了确保设计的成功&#xff0c;选择一家专业的设计公司是至关重要的&#xff0c;而北京蓝蓝设计公司就是您的…...

Java从入门到精通-类和对象(二)

0. 类和对象 3. 类的构造方法 构造方法是一种特殊的方法&#xff0c;用于创建和初始化对象。构造方法的名称必须与类名相同&#xff0c;它没有返回值&#xff0c;并且在创建对象时自动调用。构造方法的主要作用是确保对象在创建时具有合适的初始状态。 以下是构造方法的基本概…...

Python解析MDX词典数据并保存到Excel

原始数据和处理结果&#xff1a; https://gitcode.net/as604049322/blog_data/-/tree/master/mdx 下载help.mdx词典后&#xff0c;我们无法直接查看&#xff0c;我们可以使用readmdict库来完成对mdx文件的读取。 安装库&#xff1a; pip install readmdict对于Windows平台还…...

线性代数的本质(四)

文章目录 行列式二阶行列式 n n n 阶行列式行列式的性质克拉默法则行列式的几何理解 行列式 二阶行列式 行列式引自对线性方程组的求解。考虑两个方程的二元线性方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1 \\ a_{21}x_…...

FreeMarker详细介绍

FreeMarker详细介绍 FreeMarker FreeMarker概述 FreeMarker概念 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 是一个Java类库…...

房地产小程序 | 小程序赋能,房地产业务数字化升级

随着科技的不断发展&#xff0c;房地产行业正逐渐向数字化转型。在这个过程中&#xff0c;房地产小程序成为了一种重要的工具&#xff0c;可以帮助房地产企业提供更好的购房体验、增加销售额&#xff0c;并实现管理的便捷化。 优点 便捷购房体验&#xff1a;房地产小程序为用户…...

Databend 开源周报第 110 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 使用 BendSQL 管…...

wordpress登录无反应/自媒体135网站免费下载安装

该文章属于《Java并发编程》系列文章&#xff0c;如果想了解更多&#xff0c;请点击《Java并发编程之总目录》 前言 在上篇文章《Java并发编程之锁机制之Lock接口》中&#xff0c;我们已经了解了&#xff0c;Java下整个Lock接口下实现的锁机制是通过AQS(这里我们将AbstractQueu…...

wordpress 做网站/网推公司干什么的

2016年6月6日&#xff0c; 加州讯&#xff0c;世界领先的高性能计算、数据中心端到端互连方案提供商Mellanox&#xff08;纳斯达克交易所代码: MLNX&#xff09;今天宣布&#xff0c;正式推出针对网络及存储应用的BlueField 系列SoC可编程芯片。该系列产品能够满足业界日益增长…...

wordpress jfinal/免费引流推广工具

本节大纲&#xff1a; 一&#xff1a;双层装饰器&#xff1a;一个函数可以被多层装饰器进行装饰&#xff0c;函数渲染&#xff08;编译&#xff09;从下到上&#xff0c;函数执行从上到下。如下程序&#xff1a; 1 #!/usr/bin/env python2 #-*-coding:utf-8-*-3 # author:liume…...

温州市网站建设公司/提高百度搜索排名

怎样调用一个由char * 指针指向函数名的函数&#xff1f;最直接的方法就是维护一个名字和函数指针的列表&#xff1a; int one_func(), two_func(); int red_func(), blue_func(); struct { char *name; int (*funcptr)(); } symtab[] {"one_func", o…...

酒泉哪家公司可以做网站/搜狐视频

点击左上方蓝字关注我们【飞桨开发者说】尹梓琦&#xff0c;北京理工大学在读本科生&#xff0c;关注图深度学习&#xff0c;图挖掘算法和谱图理论随着深度学习在欧几里得空间的成功应用&#xff0c;例如CNN&#xff0c;RNN等极大的提高了图像分类&#xff0c;序列预测等任务的…...

杭州网站建站公司/哈尔滨网络优化推广公司

为什么要说AbstractQueuedSynchronizer呢&#xff1f; 因为AbstractQueuedSynchronizer是JUC并发包中锁的底层支持&#xff0c;AbstractQueuedSynchronizer是抽象同步队列&#xff0c;简称AQS&#xff0c;是实现同步器的基础组件&#xff0c;并发包中锁的实现底层就是使用AQS实…...