Qt案例-编译阿里云OSS对象存储C++ SDK源码,并进行简单下载,上传数据,显示进度等相关功能

news2024/10/12 18:23:26

项目中用到了阿里云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-sdk

INCLUDEPATH += $$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/ -llibeay32

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -lssleay32
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/OSS/other/x64/ -lssleay32

win32: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());
     }
 }
 // 关闭SDK
 ShutdownSdk();

进度下载:

当通过线程进行下载时注意 通过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中实现。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM类加载和双亲委派机制

当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把类加载到JVM&#xff0c;本文主要说明类加载机制和其具体实现双亲委派模式。 一、类加载机制 类加载过程&#xff1a; 类加载的过程是将类的字节码加载到内存中的过程&#xff0c;主要包括…

基于SSM的物流管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”怎么处理?(方法一)...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 晓畅军事&#xff0c;试用于昔日。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【哎呦喂 是豆子&#xff5e;】问了一个Python自…

ASUS华硕天选4笔记本FX507VU FX707V原厂Win11系统

自带网卡、显卡、声卡等所有驱动、出厂主题壁纸LOGO、Office办公软件、华硕电脑管家、奥创控制中心等预装程序 链接&#xff1a;https://pan.baidu.com/s/1KwFu-39x7UJsFKN4BQMoBQ?pwdf5xa 提取码&#xff1a;f5xa

基于Java+SpringBoot+Vue前后端分离库存管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

《Graph of Thoughts: Solving Elaborate Problems with Large Language Models》中文翻译

《Graph of Thoughts: Solving Elaborate Problems with Large Language Models》- 思维图&#xff1a;用大型语言模型解决复杂的问题 论文信息摘要1. 介绍2. 背景及符号2.1 语言模型和情境学习 3. GoT 框架3.1 推理过程3.2 思想转变3.3 评分和排名思路 4. 系统架构及扩展性4.1…

深圳汇报片制作需要优先了解哪些信息

在现代社会中&#xff0c;汇报片成为了一种重要的传媒形式&#xff0c;被广泛应用于各个领域。无论是在企业、政府机构还是学术界&#xff0c;制作一部高质量的汇报片都是非常重要的。而要制作出一部成功的汇报片&#xff0c;一个合理的制作结构是至关重要的。 一个典型的汇报…

数据结构:线性表之-单向链表(无头)

目录 什么是单向链表 顺序表和链表的区别和联系 顺序表&#xff1a; 链表&#xff1a; 链表表示(单项)和实现 1.1 链表的概念及结构 1.2单链表(无头)的实现 所用文件 将有以下功能&#xff1a; 链表定义 创建新链表元素 尾插 头插 尾删 头删 查找-给一个节点的…

H.264编码及AAC编码基础

文章目录 前言一、视频编码的实现原理1、视频编码技术的基本原理2、视频编码技术的实现方法3、运动估计和补偿①、块&#xff08;Block&#xff09;与宏块&#xff08;MicroBlock&#xff09;②、I 帧、P 帧、B 帧的小结③、I 帧&#xff08;帧内编码&#xff09;④、如何衡量和…

软件测试中的43个功能测试点总结

功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。针对web系统的常用测试方法如下&#xff1a; 1、页面链接检查&#xff1a; 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正…

EasyPHP-Devserver-17安装和配置mantisBT

文章目录 1、准备工作2、安装easyphp2.1 http://127.0.0.1 无法访问 3、安装mantisBT和phpMyAdmin3.1 配置浏览器的访问url和端口号&#xff08;配置局域网内可访问&#xff09;3.2 安装mantis 4、Administrator 注册新用户时设置登录密码5、附件上传6、邮件配置 文章参考自&am…

模型推理后处理C++代码优化案例

文章目录 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;小结 项目场景&#xff1a; 经过推理的后处理运行时间的优化。 先来看下优化前后的时间对比&#xff1a; 优化前&#xff1a; 优化后&#xff1a; 提升还是很大的。 问题描述 模型推理后得…

mybatis-plus 数据字段进行加解密入库,且加密字段支持模糊搜索

mybatis-plus 数据进行字段加解密入库&#xff0c;加密字段支持模糊搜索 前提介绍 &#xff08;开发环境需求&#xff09; 1. 开发框架、环境 springbootmybatis-plusmysql5.7&#xff08;oracle应该也是可以的&#xff0c;没有测试&#xff0c;但实现思路是都可以满足&…

CSP 202206-1 归一化处理

答题 #include<iostream> #include<cmath> using namespace std;int main() {int n;double variance0,average0;cin>>n;double a[n];for(int i0;i<n;i){cin>>a[i];averagea[i];}averageaverage/n;for(int i0;i<n;i){variance(a[i]-average)*(a[…

Redis事务的理解

介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包&#xff0c;然后一次性、按照顺序地执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会因为其他客户端请求而中断事务的执行功能&#xff0c;他会将事务中的…

nvidia-smi 命令详解

nvidia-smi 命令详解 1. nvidia-smi 面板解析2. 显存与GPU的区别 Reference: nvidia-smi命令详解 相关文章&#xff1a; nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 nvidia-smi(NVIDIA System Management Interface) 是一种命令行实用程序&#xff0c;用于监控和管理 NVIDIA G…

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路&#xff0c;今日学习的是GPIO的上拉下拉&#xff0c;输入输出的读取&#xff0c;文章贴出完整操作步骤过程&#xff0c;贴出源码。 目录 Linux常用文件命令&#xff1a; ls&#xff08;list&#xff09;列表&#xff1a; man&#xff1a; …

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时&#xff0c;突然发现了一个错误提示&#xff1a;“无法启动程序&#xff0c;因为找不到msvcp140.dll文件”。这让我非常困惑&#xff0c;因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”&#xff0c;这个…

apache-activemq-5.17.1一键安装安装

下载 安装 双击InstallService.bat脚本 查看是否安装完成

C# Solidworks二次开发:创建草图文本和创建草图中心线API详解

今天要介绍的是关于如何创建草图文本的API以及创建草图中心线的API&#xff0c;同时把一些连带的API也会和大家介绍一下&#xff0c;依然是满满的干货。 &#xff08;1&#xff09;创建草图文本API&#xff0c;InsertSketchText() 这个API的输入参数如下图所示&#xff1a; 一…