Windows下Qt使用AWS SDK for C++连接MinIO服务器

这篇具有很好参考价值的文章主要介绍了Windows下Qt使用AWS SDK for C++连接MinIO服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MinIO——分布式对象存储服务器。
它是一个是一个高性能的对象存储服务器,用于构建云存储解决方案,出于工作需求用到了这个MinIO来管理文件。

但,我用的是Qt,c++语言,并且使用环境是windows,可MinIO的C++ SDK只能Linux使用,不支持Windows,如果非要自己编译Windows版本的话估计得踩不少坑,放过自己吧。

最后只能折中于使用AWS SDK for C++,好在MinIO是兼容AWS SDK的?

安装vcpkg

先安装AWS SDK for C++,需要先安装vcpkg:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.bat

等安装完成后,将vcpkg的环境加入系统环境变量,这样才能在cmd窗口随意使用vcpkg命令。
右键“我的电脑” >> 属性 >> 高级系统设置 >> 环境变量 >> 系统变量>> path
双击“path”把vcpkg的环境加入其中。
qtaws,Qt,qt,c++添加完成后,一路点击“确定”按钮退出界面。

安装AWS SDK for C++

按下win+R输入cmd回车,打开窗口后,输入以下命令:

vcpkg search aws-sdk-cpp
vcpkg install aws-sdk-cpp[s3]:x64-windows

这里可能会因为网络问题下载包失败,失败后重来,总会成功的。
等成功安装后,会在vcpkg中看到这样一个路径:D:\Soft\vcpkg\vcpkg\installed\x64-windows
这里面lib、include、bin文件夹中的内容,就是我们需要的。

创建Qt项目

随便创建一个qt项目,在pro文件中加入:

INCLUDEPATH += D:/Soft/vcpkg/vcpkg/installed/x64-windows/include
LIBS += -LD:/Soft/vcpkg/vcpkg/installed/x64-windows/lib -laws-cpp-sdk-core -laws-c-auth -laws-c-cal -laws-c-common \
-laws-c-compression -laws-c-event-stream -laws-checksums -laws-c-http -laws-c-io \
-laws-cpp-sdk-dynamodb -laws-cpp-sdk-kinesis -laws-cpp-sdk-s3 -laws-crt-cpp

对接MinIO

使用aws-sdk-cpp的接口,连接MinIO服务器,要确保服务器已打开。
完成功能:连接服务器、创建Bucket、列出Buckets的名字、上传文件、下载文件、删除文件、删除Bucket。

#include <QFile>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/DeleteObjectRequest.h>
#include <aws/s3/model/CreateBucketRequest.h>
#include <aws/s3/model/DeleteBucketRequest.h>
#include <aws/core/auth/AWSCredentialsProviderChain.h>

void DemoQML::initMinIO()
{
    // 连接服务器
    Aws::SDKOptions options;
    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
    Aws::InitAPI(options);

    Aws::Client::ClientConfiguration cfg;
    cfg.endpointOverride = "127.0.0.1:9000";
    cfg.scheme = Aws::Http::Scheme::HTTP;
    cfg.verifySSL = false;
    Aws::Auth::AWSCredentials cred("hualongxunda", "hualongxunda");

    Aws::S3::S3Client client(cred, cfg, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Always, false,
    Aws::S3::US_EAST_1_REGIONAL_ENDPOINT_OPTION::NOT_SET);

    std::string fileName = "2104616062021073019firstpush_00004893_OK.bmp";
    std::string BucketName = "mybucket";


    // 创建Bucket
    Aws::S3::Model::CreateBucketRequest create_bucket_request;
    create_bucket_request.SetBucket(BucketName);
    create_bucket_request.SetCreateBucketConfiguration({});
    auto create_bucket_outcome = client.CreateBucket(create_bucket_request);
    if (create_bucket_outcome.IsSuccess()) {
        qDebug() << "Bucket created successfully.";
    } else {
        qDebug() << "Failed to create bucket: " <<
                    create_bucket_outcome.GetError().GetMessage().c_str();
        Aws::ShutdownAPI(options);
        return;
    }


    // 列出Buckets的名字
    auto response = client.ListBuckets();
    if (response.IsSuccess()) {
        auto buckets = response.GetResult().GetBuckets();
        for (auto iter = buckets.begin(); iter != buckets.end(); ++iter) {
            qDebug() << "--" << iter->GetName().c_str()
                     << iter->GetCreationDate().ToLocalTimeString(Aws::Utils::DateFormat::ISO_8601).c_str();
        }
    }


    // 上传文件
    QFile file(QString::fromStdString(fileName));
    file.open(QIODevice::ReadOnly);
    Aws::S3::Model::PutObjectRequest putObjectRequest;
    putObjectRequest.WithBucket(BucketName.c_str()).WithKey(fileName.c_str());
    std::shared_ptr<Aws::IOStream> input_data = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");
    *input_data << file.readAll().toStdString();
    file.close();
    putObjectRequest.SetBody(input_data);
    auto putObjectResult = client.PutObject(putObjectRequest);
    if (putObjectResult.IsSuccess())
    {
        qDebug() << "upload file success!";
    }
    else
    {
        qDebug() << "upload file error: " <<
                     putObjectResult.GetError().GetExceptionName().c_str() << " " <<
                     putObjectResult.GetError().GetMessage().c_str();
        Aws::ShutdownAPI(options);
        return;
    }


    // 下载文件
    Aws::S3::Model::GetObjectRequest object_request;
    object_request.WithBucket(BucketName.c_str()).WithKey(fileName.c_str());
    auto get_object_outcome = client.GetObject(object_request);
    if (get_object_outcome.IsSuccess())
    {
        Aws::IOStream &local_file = get_object_outcome.GetResult().GetBody();
        if (!local_file) {
            qDebug() << "Error opening file";
            Aws::ShutdownAPI(options);
            return;
        }
        std::istreambuf_iterator<char> begin(local_file);
        std::istreambuf_iterator<char> end;
        std::string buffer(begin, end); // 读取整个文件内容
        QFile file_(QString::fromStdString("./test/"+fileName));
        if(file_.open(QIODevice::ReadWrite | QIODevice::Truncate)){
            file_.write(QByteArray::fromStdString(buffer));
            file_.close();
        }
        qDebug() << "download success!";
    }
    else
    {
        std::cout << "GetObject error: " <<
                     get_object_outcome.GetError().GetExceptionName() << " " <<
                     get_object_outcome.GetError().GetMessage() << std::endl;
    }


    // 删除文件
    Aws::S3::Model::DeleteObjectRequest delete_object_request;
    delete_object_request.WithBucket(BucketName.c_str()).WithKey(fileName.c_str());
    auto delete_object_outcome = client.DeleteObject(delete_object_request);
    if (delete_object_outcome.IsSuccess()) {
        qDebug() << "File deleted successfully.";
    } else {
        qDebug() << "Failed to delete file: " <<
                    delete_object_outcome.GetError().GetMessage().c_str();
    }


    // 删除Bucket,一定要先删除文件,再删除Bucket
    Aws::S3::Model::DeleteBucketRequest delete_bucket_request;
    delete_bucket_request.SetBucket(BucketName.c_str());
    auto delete_bucket_outcome = client.DeleteBucket(delete_bucket_request);
    if (delete_bucket_outcome.IsSuccess()) {
        qDebug() << "Bucket deleted successfully.";
    } else {
        qDebug() << "Failed to delete bucket: " <<
                    delete_bucket_outcome.GetError().GetMessage().c_str();
    }


    Aws::ShutdownAPI(options);
}

运行

编译release版本后,如果运行失败,可以将D:\Soft\vcpkg\vcpkg\installed\x64-windows\bin 目录下有用到的dll文件,复制到qt程序的exe同级目录下。
qtaws,Qt,qt,c++文章来源地址https://www.toymoban.com/news/detail-787530.html

到了这里,关于Windows下Qt使用AWS SDK for C++连接MinIO服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C++)

    ​ Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度

    2024年02月03日
    浏览(59)
  • 解决windows11下SSH不能连接远端服务器-Permission denied (publickey)-Permissions for ‘xxx‘ are too open-管道不存在等问题

    按照下面的步骤做一遍。我也搞不清哪些解决方式和哪些问题对应,多试一试就好了。 HostName和User换成对应的名字。 IdentityFile换成对应的密匙文件。 在搜索栏搜索服务: 确认电脑上有这两个服务: 状态和我上面设置的一样。(记得更改运行状态。我设置成正在启动/自动延

    2024年02月04日
    浏览(79)
  • windows系统部署minio,以及添加到系统服务器

    最近想配置一款可以存储文件的服务器,如果使用阿里云OSS、七牛云、腾讯云需要收取比较高的费用,为了节约成本,考虑使用免费开源的软件进行部署,然后对fastDFS和MiniO进行了对比: fastDFS分布式服务部署完成,需要具备以下的知识: linux基础的目录操作 常用的分布式主

    2024年02月02日
    浏览(49)
  • 【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MinIO的使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 MinIO是一种高性能、可扩展的 对象存储服务 ,它可以在私有云、公共云和边缘计

    2024年02月08日
    浏览(56)
  • ComPDFKit PDF SDK for Windows Crack

    添加了在创建文本框时调整默认属性的支持。 增加了对调整PDF大小时调整宽度的支持。 添加了对编辑文本时更多快捷方式的支持。 优化了文本输入,并将字体样式与原始文本相匹配。 在内容编辑器模式下复制和粘贴时优化了UI交互。 ComPDFKit PDF SDK允许开发人员在Windows(iOS和

    2024年02月12日
    浏览(40)
  • ComPDFKit Conversion SDK for Windows Crack

    High-fidelity PDF conversion to MS Office, HTML, Text, CSV, RTF, Images, and more. ComPDFKit Conversion SDK can be used to convert PDF to Word, PDF to Excel and PDF to PPT. It uses native conversion without any server-side dependencies such as Microsoft Office or LibreOffice, which ensures the security of private information. ComPDFKit Conversion SDK provide

    2024年02月09日
    浏览(44)
  • 在QT中使用多线程并发服务器(C++)

    什么是多线程并发服务器?在QT里如何使用多线程并发服务器呢? 多线程并发服务器是一种网络服务器设计,它能够同时处理多个客户端的请求。在多线程服务器中,主线程负责监听和接受来自客户端的连接请求,每当有一个新的连接请求到来时,服务器就会创建一个新的线

    2024年04月11日
    浏览(41)
  • 通过FinalShell连接AWS的EC2服务器

    今天通过AWS的EC2服务器,搭建了一下ChatGPT的服务,体验了一把,通过FinalShell连接AWS的EC2服务器遇到了一个问题,记录一下。 小插曲 :(ChatGPT的服务后续将集成到“ 韭盾 ”公众号合“ 安前码后 ”公众号,一个是赚钱的号,一个是提升技术的号,可以体验一把) 第一次在

    2024年02月04日
    浏览(44)
  • 使用 Qt for Android 获取并利用手机传感器数据(下篇)使用C++实现功能

    在上一篇,我们搭建了开发环境。本篇,使用C++代码真正实现功能。我们使用UDP协议从手机上指定发送的目的地、端口。效果如下图,完整工程参考https://gitcode.net/coloreaglestdio/qtcpp_demo/-/tree/master/android/sensors2pc: 移动端1 移动端2 桌面 我们建立一个Qt的Widgets程序,添加 positio

    2024年02月13日
    浏览(46)
  • 使用 AWS Go SDK 读取审计日志(CloudTrail)

    公司的海外业务需要将云上的操作读取到内部的日志文件中,永久保存,供内部审计使用。 由于之前没有用过AWS相关的SDK,在使用过程中也遇到一些困难,这里记录一下,并且总结一下过程。 快速开始 代码参考地址:https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/go/example_cod

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包