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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 中crontab 定时任务计划创建时间文件夹示例

1.创建一个sh脚本 /usr/bin/mkdir 是mkdir命令的路径 /usr/bin/chmod 是chmod命令的路径 2.编辑定时任务 crontab -e

Hadoop学习笔记(HDP)-Part.11 安装Kerberos

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

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

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

csp 现值计算 C语言

号&#xff1a; 202212-1 试题名称&#xff1a; 现值计算 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 问题描述 评估一个长期项目的投资收益&#xff0c;资金的时间价值是一个必须要考虑到的因素。简单来说&#xff0c;假设…

背包问题学习

背包问题是常见的动态规划dp的问题 下面用到的符号: 常用n表示物品数, m表示背包容积f[i][j]表示i件物品, j的背包容量的最大价值w[i]表示第i件物品的价值, v[i] 表示第i件物品的容量f[0][0~m] 0, 所以n可以从1开始遍历一般是有两层嵌套循环 第一层遍历物品, 第二层遍历背包…

计网Lesson6 - IP 地址分类管理

文章目录 1. I P IP IP 地址定义2. I P v 4 IPv4 IPv4 的表示方法2.1 I P v 4 IPv4 IPv4 的分类编址法2.2 I P v 4 IPv4 IPv4 的划分子网法2.2.1 如何划分子网2.2.2 如何确定子网的借位数2.2.3 总结2.2.4 题目练习 2.3 I P v 4 IPv4 IPv4 的无分类编址法 1. I P IP IP 地…

zabbix的自动发现机制、代理功能、SNMP监控

一、自动发现&#xff08;不安全&#xff0c;有时会失效&#xff0c;建议手动添加主机&#xff09; 1、定义 zabbix主动与服务端联系&#xff0c;将自己的地址和端口发送给服务端&#xff0c;实现自动添加监控主机 客户端是主动的一方 2、缺点 若自定义网段中主机数量太多…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时&#xff0c;想必耳朵都听出老茧了。 真不是故意的&#xff0c;有时候任务比较急&#xff0c;就先改了代码&#xff0c;想着以后再同步文档&#xff0c;然后就给忘了。 项…

HarmonyOS带大家创建自己的第一个Page页面并实现路由跳转

我们 在开发过程中 经常会看到 被 艾特修饰的代码 有限像 java中的注解 在 harmonyOS 中 这叫 装饰器 被关键字装饰取来的代码 会具备某某功能 我们这里先来创建一个新的界面 在pages 目录下 右键 如下图 选择page创建 这里 我们取名叫 AppView 然后点击右下角 Finish 这样…

线程池原理初探

1.引言 合理利用线程池能够带来三个好处。第一&#xff1a;降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二&#xff1a;提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行。第三&#xff1a;提高线程的可管理性。…

CoreDNS实战(七)-日志处理

本文主要用于介绍CoreDNS用来记录日志的几种方式以及在生产环境中遇到的一些问题和解决方案。 1 log插件 coredns的日志输出并不如nginx那么完善&#xff08;并不能在配置文件中指定输出的文件目录&#xff0c;但是可以指定日志的格式&#xff09;&#xff0c;默认情况下不论…

手写分析文件大小工具

背景&#xff1a; window 用久了磁盘变红了&#xff0c;又不想安装大文件分析的软件&#xff0c;突发奇想能否自己写一个代码&#xff0c;分析有哪些大文件 文件的单位&#xff0c;最高记作G // 文件大小单位static String[] fileSizeUnits {"B", "KB", …

SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理

1、参考文档 Spring Cloud Alibaba参考文档 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html Spring Cloud Alibaba官方文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/ 2、引入 Alibaba 依赖 每个 SpringBoot 都有对应的…

kubernetes详解——从入门到入土(更新中~)

k8s简介 编排工具&#xff1a;系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose&#xff1a;实现单机容器编排docker swarm&#xff1a;实现多主机整合成为一个docker machine&#xff1a;初始化新主机mesos marathonmesos …

如何编写一份完整的软件测试报告?(进阶版)

作为测试从业者&#xff0c;编写测试用例&#xff0c;测试计划&#xff0c;测试报告都是必经之路&#xff0c;最近完成了年终述职以及版本准出&#xff0c;感觉测试报告或者各类报告真是职场人不可或缺的一项技能&#xff0c;趁着热乎劲&#x1f525;&#xff0c;写下一些注意事…

win10下maven安装与配置

1.下载安装 去官网下载最新版的安装包&#xff0c;然后解压到安装目录。 2.配置 右键桌面的计算机图标&#xff0c;属性–>高级系统设置–>环境变量&#xff0c;添加M2_HOME的环境变量&#xff0c;然后将该变量加入的PATH中。 如果想要修改maven的本地仓库位置&…

Hadoop完全分布式搭建教程(完整版)

分别创建三个节点 master slave1 slave2 在master节点下安装jdk # 解压 [rootmaster /]# tar -zxvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/ # 修改安装包名为 java [rootmaster /]# mv /opt/module/jdk1.8.0—212/ /opt/module/java# 配置环境变量并使其生…

利用 EC2 和 S3 免费搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。 &#x1f4bb;创建实例 控制台搜索EC2 点击启动EC2 选择AMI 选择可免费试用的 g代表采用了Graviton2芯片。 配置存储 配…

黑苹果配置清单

手里的MacBookPro已经快沦为电子垃圾了&#xff0c;平时用MacOS比较多&#xff0c;Window用的比较少&#xff0c;而苹果电脑的价格不管是MacBookPro还是MacMini丐版的便宜但是面对现在Window动不动就64g内存的情况就显得微不足道了&#xff0c;高配的价格直接把我劝退&#xff…

Ansys Speos SSS|执行 Camera Sensor模拟结果后处理

附件下载 联系工作人员获取附件 概述 本文是Speos Sensor System&#xff08;SSS&#xff09;的使用指南&#xff0c;这是一个强大的解决方案&#xff0c;用于camera sensor模拟结果的后处理。本文的目的是通过一个例子来理解如何正确使用SSS。当然本文描述的分析步骤适合任…