当前位置: 首页 > 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…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...

华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...

DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model

一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...