C++ 操作MinIO做文件数据的上传和下载(踩坑与经验)包含编译包

前言

最近在做项目流程优化,准备将之前的java对文件的操作转换到c++端,因此做了基于c++的minio操作的测试demo。期间的各种踩坑与问题,花了一天时间总算是成功了,当然还有一些小问题,等待后续其他大拿解决。

项目环境

vs2019个人版

minio操作的代码本来是计划自己下载源码编译的,但觉得它麻烦,就在csdn上下载了被人编译好的,s3 vs2019 debug(此处第一个坑),我自己刚开始的开发环境直接就是release版本,也是最近一直是release版本,所以配置完环境变量就没有注意,直接开始跑代码了,各种问题也没有仔细查,折腾了几个小时,才发现,这个坑我在最后给大家展示。
minio的编译好的链接是:链接: AWS S3 对象云存储_SDK msvc_x64下使用_vs2019编译 debug库。

测试代码

需要准备的头文件和宏定义等(请严格按照此复制,不要轻易重新):

#define USE_IMPORT_EXPORT
#include"iostream"#include "aws\s3\S3Client.h"
#include "aws\core\Aws.h"
#include "aws\core\auth\AWSCredentialsProvider.h"
#include <iostream>
#include <fstream>
using namespace Aws::S3;
using namespace Aws::S3::Model;
using namespace std;#include "aws\s3\model\PutObjectRequest.h"
#include "aws\s3\model\GetObjectRequest.h" 
#include <aws/s3/model/ListObjectsRequest.h>

文件上传的代码:


bool uploadfile(std::string BucketName, std::string objectKey, std::string pathkey)
{Aws::SDKOptions m_options;S3Client* m_client = { NULL };Aws::InitAPI(m_options);Aws::Client::ClientConfiguration cfg;cfg.endpointOverride = "192.111.111.111:901";  // S3服务器地址和端口cfg.scheme = Aws::Http::Scheme::HTTP;cfg.verifySSL = false;Aws::Auth::AWSCredentials cred("2222", "23666");m_client = new S3Client(cred, cfg,Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always, false);PutObjectRequest putObjectRequest;//BucketName桶的名称,如cplus;objectKeyoss上文件的名称,如11.txt,此处要设置好文件的后缀类型,因此其是唯一的,不然不同文件不就重名了;pathkey,待上传的数据的本地路径,即文件本身putObjectRequest.WithBucket(BucketName.c_str()).WithKey(objectKey.c_str());auto input_data = Aws::MakeShared<Aws::FStream>("PutObjectInputStream",  pathkey.c_str(), std::ios_base::in | std::ios_base::binary);putObjectRequest.SetBody(input_data);auto putObjectResult = m_client->PutObject(putObjectRequest);if (putObjectResult.IsSuccess()){std::cout << "Done!" << std::endl;return true;}else{std::cout << "PutObject error: " <<putObjectResult.GetError().GetExceptionName() << " " <<putObjectResult.GetError().GetMessage() << std::endl;return false;}if (m_client != nullptr){delete m_client;m_client = NULL;}Aws::ShutdownAPI(m_options);
}

文件下载的模块:


bool downloadfile1(std::string BucketName, std::string objectKey, std::string pathkey)
{Aws::SDKOptions m_options;S3Client* m_client = { NULL };Aws::InitAPI(m_options);Aws::Client::ClientConfiguration cfg;cfg.endpointOverride = "192.111.111.111:901";  // S3服务器地址和端口cfg.scheme = Aws::Http::Scheme::HTTP;cfg.verifySSL = false;Aws::Auth::AWSCredentials cred("123", "2222");m_client = new S3Client(cred, cfg,Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always, false);Aws::S3::Model::GetObjectRequest object_request;object_request.WithBucket(BucketName.c_str()).WithKey(objectKey.c_str());auto get_object_outcome = m_client->GetObject(object_request);if (get_object_outcome.IsSuccess()){Aws::OFStream local_file;local_file.open(pathkey.c_str(), std::ios::out | std::ios::binary);local_file << get_object_outcome.GetResult().GetBody().rdbuf();std::cout << "Done!" << std::endl;return true;}else{std::cout << "GetObject error: " <<get_object_outcome.GetError().GetExceptionName() << " " <<get_object_outcome.GetError().GetMessage() << std::endl;return false;}if (m_client != nullptr){delete m_client;m_client = NULL;}Aws::ShutdownAPI(m_options);return true;
}

关键的调用方法:


int main()
{downloadfile1("cplus","logo.png", "C:\\Users\\OUR\\Desktop\\新建文件夹\\1.png"); uploadfile("cplus","", "D:/11.txt"); 
} 

其中的关键点

(1)上传时

函数定义:bool uploadfile(std::string BucketName, std::string objectKey, std::string pathkey)
函数调用:uploadfile(“cplus”,“csdn.txt”, “D:/11.txt”);
参数说明分别是:

nameValue
BucketNameminio云端的桶的名称,如下截图的cpus、dicom等,此处类似于的是文件夹,注:桶需要提前设置好,在minio上新建就行
objectKey传到云端的文件的名称和后缀(此处需要唯一性),如logo.png、csdn.txt名称,注:key必须是带有后缀的,否则上传后不会自动设置文件的后缀
pathkey待上传的本地文件的路径;本地准备上传的路径和地址;注:本地文件存在即可

MinIO上“桶”列表
MinIO上“桶”列表 ↑
cplsu桶中的文件情况
cplsu桶中的文件情况↑
问题:下载数报错:

*Fatal error condition occurred in D:\SDK\aws-sdk-cpp\crt\aws-crt-cpp\crt\aws-c-io\source\event_loop.c:75: aws_thread_launch(&cleanup_thread, s_event_loop_destroy_async_thread_fn, el_group, &thread_options) == AWS_OP_SUCCESS
Exiting Application
at 0x7FFECBE41E6A: aws_byte_buf_append_null_terminator
at 0x7FFECBE41E6A: aws_byte_buf_append_null_terminator
at 0x7FFECBE41E6A: aws_byte_buf_append_null_terminator
at 0x7FFEBDAD1735: aws_retry_strategy_release
at 0x7FFECBE41E6A: aws_byte_buf_append_null_terminator
at 0x7FFEBDAD1735: aws_retry_strategy_release
at 0x7FFEBDAD1735: aws_retry_strategy_release
*

(2)下载时

std::string BucketName, std::string objectKey, std::string pathkey
“cplus”,“logo.png”, "C:\Users\OUR\Desktop\新建文件夹\1.png
分别是:

nameValue
BucketNameminio云端的桶的名称,如下截图的cpus、dicom等,此处类似于的是文件夹,注:桶需要提前设置好,在minio上新建就行
pathkeyMinio上的数据文件注:需要文件名和后缀
objectKey现在后文件的路径,如:C:\Users\OUR\Desktop\新建文件夹\1.png,注:不是设置下载文件接收的文件夹,而是文件,接收时需要自己设置文件后缀类型,否则无法下载

MinIO上“桶”列表
MinIO上“桶”列表 ↑
cplsu桶中的文件情况
cplsu桶中的文件情况↑
下载到的文件
下载到的文件↑
问题:下载数报错:
在这里插入图片描述

PutObject error: SDK failed to sign the request
Hello World!
Fatal error condition occurred in D:\SDK\aws-sdk-cpp\crt\aws-crt-cpp\crt\aws-c-io\source\event_loop.c:75: aws_thread_launch(&cleanup_thread, s_event_loop_destroy_async_thread_fn, el_group, &thread_options) == AWS_OP_SUCCESS
Exiting Application
at 0x7FFEE6CF1E6A: aws_byte_buf_append_null_terminator
at 0x7FFEE6CF1E6A: aws_byte_buf_append_null_terminator
at 0x7FFEE6CF1E6A: aws_byte_buf_append_null_terminator
at 0x7FFEC9AD1735: aws_retry_strategy_release
at 0x7FFEE6CF1E6A: aws_byte_buf_append_null_terminator
at 0x7FFEC9AD1735: aws_retry_strategy_release
at 0x7FFEC9AD1735: aws_retry_strategy_release

待后来人解决吧

结论

此代码可以实现对minio的文件上传与下载,是最简单的代码。使用的是vs2019、debug 、x64环境、时使用的是现成被人编译好的结果。

改进意见

(1)对minio的配置最好使用init()的方式进行统一配置,调用时在桶下建立自己的文件夹
(2)后续的报错还没有解决,计提原因未知,我就不查了
(3)现在只有debug,最终的生产环境一般都是release,所有孩子要去官网下载源码编译,才是成就之举。
(4)等我有时间了,项目有真正需求了,再专门写个帖子做minio的c++编译。

敬请期待哦!
参考资料:https://www.jianshu.com/p/74f13cd08cc7

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

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

相关文章

Jmeter调用本地Exe程序

背景&#xff1a; 候使用C#编译的小工具制作压测的请求的入参&#xff0c;因Jmeter无法调用C#的方法&#xff0c;可以把C#编译个exe程序&#xff0c;在启动压测前&#xff0c;让JMeter调用本地的exe批量生成压测数据。 使用步骤&#xff1a; 打开Jmeter&#xff0c;右击选择…

【Vue】使用cmd命令创建vue项目

上一篇&#xff1a; node的安装与配置 https://blog.csdn.net/m0_67930426/article/details/134562278?spm1001.2014.3001.5502 目录 一.创建空文件夹专门存放vue项目 二. 查看node , npm 和vue脚手架的版本 三.安装vue脚手架 四.创建vue项目 五.运行项目 一.创建空文件…

第五期丨酷雷曼无人机技能培训圆满举办

第5期无人机技能提升培训 2023年11月28日-29日&#xff0c;为期2天的酷雷曼第五期无人机技能提升培训会圆满举办。本届培训会盛况依旧&#xff0c;数十位合作商不远千里相约&#xff0c;共同提升专业水准&#xff0c;考取执照证书。 入场签到 初冬已至&#xff0c;尽管天气渐…

properties出现中文乱码解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在使用Properties类的时候,中文出现乱码 如图所示: 正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式 通过下方的改动: 可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网…

PVE系列-LVM安装MacOS的各个版本及VNC加密隧道访问

PVE系列-LVM安装MacOS的各个版本 环境配置大概过程&#xff1a;详细步骤&#xff1a;1.建立安装环境和下载安装工具2. 重启后&#xff0c;执行osx-setup配置虚拟机3. 安装到硬盘&#xff0c;4.设定引导盘&#xff0c;以方便自动开机启动5.打开屏幕共享和系统VNC6.VNC加密的ssh隧…

synchronized底层原理(二)

书接上文 文章目录 1. 锁升级原理2. Synchronized锁优化1. 偏向锁批量重偏向&批量撤销2. 自旋优化3. 锁粗化4. 锁消除 1. 锁升级原理 前面介绍了对象的几种加锁状态&#xff0c;分别是无锁、偏向锁、轻量级锁和重量级锁。有下面几个关键点&#xff1a; 当开启JVM偏向延迟…

什么是美颜sdk?美颜sdk对比评测、技术评估

为了满足用户对于更美好画面的需求&#xff0c;各种美颜sdk应运而生。本文将深入探讨美颜sdk的概念&#xff0c;进行对比评测&#xff0c;并对其技术进行综合评估。 一、什么是美颜sdk&#xff1f; 美颜sdk使开发者们可以方便地在自己的应用中集成美颜功能&#xff0c;从而提…

【5】PyQt按钮

QPushButton 常见的按钮实现类包括:QPushButton、QRadioButton和QCheckBox QPushButton是最普通的按钮控件&#xff0c;可以响应一些用户的事件 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton import sysdef func():print("按下按钮啦&#xff0c;火…

C语言每日一题(46)整数转罗马数字

力扣网12 整数转罗马数字 题目描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …

Isaac Sim教程06 OmniGraph图编程

Isaac Sim OmniGraph图编程 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The autho…

Spring容器启动过程中的自定义操作插口汇总

目录标题 PostConstruct注解EventListener方式InitializingBean的afterPropertiesSet方法实现ApplicationRunner接口重写run方法实现AplicationContextAware接口重写setApplicationContext实现ServletContextListener接口contextInitialized方法实现ServletContextAware接口set…

7个简单技巧,让你从容应对压力面试!

01-什么是压力面试&#xff1f; 压力面试是指有意制造紧张&#xff0c;以了解求职者将如何面对工作压力的一种面试形式。 事实上&#xff0c;压力面试不是单独存在的一类面试&#xff0c;往往是穿插在面试过程中。 面试人通过提出不礼貌、冒犯的问题&#xff0c;或者用怀疑、…

梦回吹角连营(2)(快速幂快乘)

Description 给定f(n)(a1)*n^a(a2)*n^(a1)...b*n^(b-1) 求f(n)%10000000033 Input 输入一个正整数T(T<10),表示有T组数据&#xff0c;每组数据包括三个整数a,b,n (0<n<10^9,1<a < b-1<10^20) Output 输出 f(n)%10000000033 的结果 Sample Input 1 1 2…

十三、FreeRTOS之FreeRTOS时间管理

本节主要介绍以下内容&#xff1a; 1&#xff0c;延时函数介绍&#xff08;了解&#xff09; 2&#xff0c;延时函数解析&#xff08;熟悉&#xff09; 3&#xff0c;延时函数演示实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&#xff09; 一、…

最新测试开发招聘信息汇总,内含社招和实习生岗位~

1 科大讯飞 [武汉/合肥/西安] 科大讯飞&#xff08;教育事业部&#xff09; - 移动、服务端高级测试开发工程师 一、移动方向高级测试开发工程师 岗位职责&#xff1a; 1.负责教育 BG 中 APP/SDK/软硬一体等产品类型的专项测试工作&#xff0c;包括专项测试方案设计、自动化测…

通过时间交织技术扩展ADC采样速率的简要原理

前言 数据采集是将自然界中存在的模拟信号通过模数转换器&#xff08;ADC&#xff09;转换成数字信号&#xff0c;再对该数字信号进行相应的接收和处理。数据采集系统作为数据采集的手段&#xff0c;在移动通信、图向采集、无线电等领域有重要作用。随着电子信息技术的飞速发展…

【计算机系统基石与Linux进程管理深度解析】

​​​​​​​ 【本节重点】 认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念&#xff0c;了解PCB 学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如…

IO / day03 作业

1. 使用文件IO完成对图像的读写操作 代码 #include<myhead.h>int main(int argc, const char *argv[]) {int fd-1;if((fd open("./bird.bmp", O_RDWR)) -1){perror("fopen error");return -1;}//读取该图片的大小&#xff0c;需要将光标向后偏移…

通过pipeline配置sonar自动化实现过程解析

这篇文章主要介绍了通过pipeline配置sonar自动化实现过程解析,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.sonar配置webhooks&#xff0c; 2.url填写jenkins的地址&#xff1a;http://jenkinsurl/sonarqu…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…