在cpp上使用aws-cpp-sdk-s3连接minio的工具代码

使用docker创建minio分布式存储服务器

拉取minio

docker pull minio/minio

创建minio容器

docker run -p 9000:9000 -p 9001:9001 --name minio -e "MINIO_ROOT_USER=hongyaohongyao" -e "MINIO_ROOT_PASSWORD=hongyaohongyao123" -v /d/cache/docker/minio/data:/data -d minio/minio server /data --console-address ":9001"

MINIO_ROOT_USER也对应后面MinioClient初始化参数中的accessKey
MINIO_ROOT_PASSWORD对应secretKey

/d/表示D盘,即D://,docker的语法。

配置aws-cpp-sdk-s3

详见我的另一篇博客

实现的功能

  • 直接上传文本内容
  • 直接下载文本内容
  • 上传opencv的图片

因为个人的项目只需要在内存中操作数据,所以暂不支持本地文件的上传下载,有需要可以自己实现,思路差不多。

s3_utils.hpp

里面还加了直接上传opencv图像的方法,如果不需要可以删掉。


#ifndef S3_UTILS_HPP
#define S3_UTILS_HPP

#include <string>
#include <opencv2/opencv.hpp>
#include <aws/s3/S3Client.h>
#include <aws/core/Aws.h>

namespace s3_utils {
    void initAwsAPI(bool shutdown = false);

    class MinioClient {
        std::shared_ptr<Aws::S3::S3Client> client_;
    public:
        MinioClient(const std::string &endpoint, const std::string &accessKey, const std::string &secretKey);

        ~MinioClient() {
            client_.reset();
        }

        bool
        upload(const cv::Mat &img, const std::string &bucketName,
               const std::string &objectKey, const std::vector<int> &vecCompression_params = {});

        bool upload(const std::string &contents, const std::string &bucketName,
                    const std::string &objectKey);

        std::string download(const std::string &bucketName, const std::string &objectKey);

        cv::Mat downloadImg(const std::string &bucketName, const std::string &objectKey);
    };
}

#endif //S3_UTILS_HPP

s3_utils.cpp

#include <common/ilogger.hpp> 提供的INFO方法,可以自己换成其他的logger

注意Aws::InitAPI和Aws::ShutdownAPI是全局的,影响的是整个程序,所以启动和关闭都在整个程序中都只需要一次。之前没理解以为是一个Aws::SDKOptions控制一个,init和shutdown了多次,结果程序就崩了🤡。

#include "common/s3_utils.hpp"

#include "aws\core\auth\AWSCredentialsProvider.h"

#include "aws\s3\model\PutObjectRequest.h"
#include "aws\s3\model\GetObjectRequest.h"
#include <common/ilogger.hpp>

#undef GetObject
#undef GetMessage


void s3_utils::initAwsAPI(bool shutdown) {
    static bool isInited = false;
    static Aws::SDKOptions options;
    if (not isInited && not shutdown) {
        Aws::InitAPI(options);
        isInited = true;
    } else if (isInited && shutdown) {
        Aws::ShutdownAPI(options);
        isInited = false;
    }
}

s3_utils::MinioClient::MinioClient(const std::string &endpoint, const std::string &accessKey,
                                        const std::string &secretKey) {
    initAwsAPI();
    Aws::Client::ClientConfiguration cfg;
    cfg.endpointOverride = endpoint;  // S3服务器地址和端口
    INFO("endpoint %s access_key %s secret_key %s", endpoint.c_str(), accessKey.c_str(), secretKey.c_str());
    cfg.scheme = Aws::Http::Scheme::HTTP;
    cfg.verifySSL = false;
    client_ = std::make_shared<Aws::S3::S3Client>(Aws::Auth::AWSCredentials(accessKey, secretKey), cfg,
                                                  Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false);
}

bool s3_utils::MinioClient::upload(const cv::Mat &img,
                                        const std::string &bucketName,
                                        const std::string &objectKey, const std::vector<int> &vecCompression_params) {
    std::vector<uchar> vec_Img;
    imencode(".jpg", img, vec_Img, vecCompression_params);
    Aws::S3::Model::PutObjectRequest putObjectRequest;
    putObjectRequest.WithBucket(bucketName).WithKey(objectKey);
    auto img_stream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");
    img_stream->write((char *) vec_Img.data(), (long long) vec_Img.size());
    putObjectRequest.SetBody(img_stream);
    auto putObjectResult = client_->PutObject(putObjectRequest);
    if (not putObjectResult.IsSuccess()) {
        INFO(putObjectResult.GetError().GetMessage().c_str());
        return false;
    }
    return true;
}

bool s3_utils::MinioClient::upload(const std::string &contents, const std::string &bucketName,
                                        const std::string &objectKey) {
    Aws::S3::Model::PutObjectRequest putObjectRequest;
    putObjectRequest.WithBucket(bucketName).WithKey(objectKey);
    auto contents_stream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream", contents);
    putObjectRequest.SetBody(contents_stream);
    auto putObjectResult = client_->PutObject(putObjectRequest);
    if (not putObjectResult.IsSuccess()) {
        INFO(putObjectResult.GetError().GetMessage().c_str());
        return false;
    }
    return true;
}

std::string s3_utils::MinioClient::download(const std::string &bucketName, const std::string &objectKey) {
    INFO("bucket: %s dir: %s", bucketName.c_str(), objectKey.c_str());
    Aws::S3::Model::GetObjectRequest object_request;
    object_request.WithBucket(bucketName).WithKey(objectKey);
    auto get_object_outcome = client_->GetObject(object_request);
    if (get_object_outcome.IsSuccess()) {
        std::ostringstream tmp;
        tmp << get_object_outcome.GetResult().GetBody().rdbuf();
        return tmp.str();
    } else {
        INFO(get_object_outcome.GetError().GetMessage().c_str());
        return "";
    }
}

cv::Mat s3_utils::MinioClient::downloadImg(const std::string &bucketName, const std::string &objectKey) {
    INFO("downloading img bucket: %s dir: %s", bucketName.c_str(), objectKey.c_str());
    Aws::S3::Model::GetObjectRequest object_request;
    object_request.WithBucket(bucketName).WithKey(objectKey);
    auto get_object_outcome = client_->GetObject(object_request);
    if (get_object_outcome.IsSuccess()) {
        auto &body = get_object_outcome.GetResult().GetBody();
        std::vector<uchar> vec_img;
        vec_img.assign(Aws::IStreamBufIterator(body), Aws::IStreamBufIterator());
        cv::Mat result = cv::imdecode(vec_img, cv::IMREAD_COLOR);
        return result;
    } else {
        INFO(get_object_outcome.GetError().GetMessage().c_str());
        return {};
    }
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【aws-java-sdk-s3-***.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【aws-java-sdk-s3-***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【aws-java-sdk-s3-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【aws-java-sdk-s3-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【aws-java-sdk-s3-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【aws-java-sdk-s3-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: aws-java-sdk-s3-***.jar中文-英文对照文档.zip,java,aws-java-sdk-s3-***.jar,com.amazonaws,aws-java-sdk-s3,***,com.amazonaws.auth,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,amazonaws,aws,sdk,s3,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【aws-java-sdk-s3-***.jar中文-英文对照文档.zip】,再解压其中的 【aws-java-sdk-s3-***-javadoc-API文档-中文(简体)-英语-对照版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '***' Gradle (Short): implementation 'com.amazonaws:aws-java-sdk-s3:***' Gradle (Kotlin): implementation("com.amazonaws:aws-java-sdk-s3:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.amazonaws.auth com.amazonaws.auth.policy.actions com.amazonaws.auth.policy.conditions ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.amazonaws.auth.AwsChunkedEncodingInputStream com.amazonaws.auth.policy.actions.S3Actions com.amazonaws.auth.policy.conditions.S3ConditionFactory ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虹幺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值