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;尽管天气渐…

第18关 K8s数据安全无忧——持久化存储详解

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;本期课程将深入解析Kubernetes的持久化存储机制,包括PV、PVC、StorageClass等的工作原理、使用场景、最佳实践等,帮您构建稳定可靠的状态存储,确保应用和数据 100% 安全。 Volume …

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;从而提…

前端食堂技术周刊第 107 期:技术博客节、Deno Cron、FEDAY、XState v5、Electron 2023 生态系统回顾

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;烤椰拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

like concat()函数

mybatis中为了防止sql注入&#xff0c;使用like语句时并不是直接使用&#xff0c;而是使用concat函数 <if test"goodName ! null and goodName ! "> and good_name like concat(%, #{goodName}, %)</if> concat()函数 1、功能&#xff1a;将多个字符串…

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

AI:LangChain

LangChain是一个开源的框架&#xff0c;旨在使开发人员能够轻松构建使用大型语言模型&#xff08;LLMs&#xff09;的应用程序。它提供了一种方式&#xff0c;通过这种方法&#xff0c;开发者可以利用像OpenAI的GPT-3或GPT-3.5这样的模型&#xff0c;以及Hugging Face提供的其他…

UVC debug 工具

v4l2-ctl media-ctl v4l2-ctl和media-ctl是Linux系统中用于配置和控制摄像头的命令行工具。 v4l2-ctl&#xff08;Video for Linux Control&#xff09;是一个用于配置和控制摄像头的工具。它允许用户查看设备的当前状态、设置视频格式、调整图像属性&#xff08;如亮度、对比…

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;或者用怀疑、…

【1day】蓝凌OA 系统custom.jsp 接口远程命令执行漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现

梦回吹角连营(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…

【1day】蓝凌OA 系统datajson.js接口远程命令执行漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现