解决方案
CSharp运行matlab库时报错libmwlapack: load error: mkl.dll.的解决方案MWMCR:EvaluateFunction error找不到指定模块
win11离线安装donet3.5的方法
Qt6离线安装方式
QFile无法打开文件明明文件已经存在却无法打开open failed路径或者卷标不正确奇葩问题
关于启用https访问Mrdoc网站cloudflare服务支持http和https同时访问
VS编译工程提示错误error C1083: 无法打开包括文件: “stddef.h”: No such file or directory该文件指向win10 kits安装windows SDK10具体方法
关于Matlab调用Python时出现的错误解决方案Python 命令需要支持的 Cpython 版本。请参阅 <a href="matlab:helpview([docroot'/matlab/helptargets.map’]
Docker构件镜像时 Sending build context to Docker daemon远远超过原镜像大小docker build超出大小原因
QEnum的正确使用方法QMetaEnum::fromType方式总是为空isValid总是为false的解决方案和方法通过键获取值通过值获取键Q_ENUM注册失败
关于静态库的使用的注意事项动态库改静态库的不同static library
windows上Qt编译源码open source building vs2022 qt5.15.17版本编译环境问题 环境配置编译QT依赖安装
Qt5.15.17源码编译的最终版windows下使用VisualStudio编译QtWebEngine组件遇到的问题及解决方案使用VS2019进行编译启用GPU硬件加速显卡OpenGL(最终版)
Qt在MainWindows上悬浮一个QWidget窗体,窗体内有四个按钮,保持QWidget在Mainwin的正中间并设置为透明背景黑色设置无效
windows脚本bat建立目录软链接 系统找不到指定的路径
rdkafka接收数据慢的解决方案发送完了却没有接收完的问题
Qt通过QSS样式将QToolButton下拉弹出菜单的提示按钮由右边让其底部居中显示
使用Qss设置背景图片的一些问题记录不生效,效率低,背景图片不能拉伸
CMakeList管理一个工程引用另外一个工程库该注意
CMakeList设置输出bin和lib目录
CMakeList中实现编译完成后自动拷贝指定文件到指定目录copy
QT工程中文出现乱码的解决方案编译后中文显示不正确显示乱码utf-8编码编译编码
windows下编译Minio cpp客户端编译过程
Minio cpp在使用时无法连接无法下载无法上传等以及直接读取字节流的方法
QT中QHash<QStirng, QSet<SOneStruct>>报错qhash没有重载函数可以转换所有的参数类型错误
Kafka不使用docker-compose不使用zookeeper启动ApacheKafka3.8.0单机运行KRAFT模式
kafka设置服务的单个消息数据缓存大小Message_Max_Bytes服务端设置
QMenu菜单通过名称查找是否已经存在名称的菜单项存在 通过findchild<Qmenu*>(menuName);无法查询到,明明menuName的菜单已经存在,却总是返回nullptr
本文档使用 MrDoc 发布
-
+
首页
Minio cpp在使用时无法连接无法下载无法上传等以及直接读取字节流的方法
# 说明 由于需要将客户端连接到minio服务,客户端是c++写的,于是需要Minio CPP这个apache开源库进行开发。 编译好这些库后,在使用时又遇到了点问题,于是有这篇文章。 我这里是在windows11下,使用Minio-cpp0.3.0版本进行测试。 # 问题1 无法连接Minio服务 当我们建立好Minio cpp客户端时,但是明明都已经设置好了,url和key等信息,对象也存在,就是无法下载文件... ```cpp #include <miniocpp/client.h> int main(int argc, char* argv[]) { // Create S3 base URL. minio::s3::BaseUrl base_url("play.min.io"); //这里是指定IP和端口 // Create S3 base URL with HTTP (非HTTPS) // MinIO默认HTTP端口是9000,play.min.io可能需要指定端口 // minio::s3::BaseUrl base_url("play.min.io", 9000, false); // 第三个参数false表示不使用SSL // Create credential provider. minio::creds::StaticProvider provider( "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"); //登录时的授权key // Create S3 client. minio::s3::Client client(base_url, &provider); std::string bucket_name = "asiatrip"; //桶 // Check 'asiatrip' bucket exist or not. bool exist; { minio::s3::BucketExistsArgs args; args.bucket = bucket_name; minio::s3::BucketExistsResponse resp = client.BucketExists(args); if (!resp) { std::cout << "unable to do bucket existence check; " << resp.Error() << std::endl; return EXIT_FAILURE; } exist = resp.exist; } // Make 'asiatrip' bucket if not exist. if (!exist) { minio::s3::MakeBucketArgs args; args.bucket = bucket_name; minio::s3::MakeBucketResponse resp = client.MakeBucket(args); if (!resp) { std::cout << "unable to create bucket; " << resp.Error() << std::endl; return EXIT_FAILURE; } } // Upload '/home/user/Photos/asiaphotos.zip' as object name // 'asiaphotos-2015.zip' to bucket 'asiatrip'. minio::s3::UploadObjectArgs args; //对于上传和下载,分别有不同的结构体 args.bucket = bucket_name; args.object = "asiaphotos-2015.zip"; //要上传的对象 args.filename = "/home/user/Photos/asiaphotos.zip"; //保存对象的路径及文件名 minio::s3::UploadObjectResponse resp = client.UploadObject(args); //上传 if (!resp) { std::cout << "unable to upload object; " << resp.Error() << std::endl; return EXIT_FAILURE; } std::cout << "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as " << "object 'asiaphotos-2015.zip' to bucket 'asiatrip'." << std::endl; return EXIT_SUCCESS; } ``` **解决方案:** == minio::s3::BaseUrl base_url("play.min.io", 9000, false); // 第三个参数false表示不使用SSL == # 问题2 直接读取Minio中的字节流,而不下载文件 如果使用下载接口,就会需要写磁盘等操作,这样会占用处理时间,而降低效率。 故有读取minio对象的字节流需求。 ```cpp #include <iostream> #include <fstream> #include <string> #include "minio/client.h" int main() { try { // 1. 创建MinIO客户端 minio::s3::Client client( "your-minio-server:9000", minio::creds::StaticCredentials( "your-access-key", "your-secret-key" ) ); // 2. 配置参数 std::string bucket_name = "your-bucket"; std::string object_name = "your-object"; std::string output_filename = "downloaded_file.bin"; // 3. 打开本地文件用于写入文件流,//这里是传入文件流,也可以是QByteArray std::ofstream output_file(output_filename, std::ios::binary); if (!output_file.is_open()) { std::cerr << "Error: Failed to open output file '" << output_filename << "' for writing." << std::endl; return 1; } // 4. 准备下载参数 minio::s3::GetObjectArgs args; args.bucket = bucket_name; args.object = object_name; // 5. 设置数据回调函数(将接收到的数据块写入文件) //lamada函数 //&output_file传入参数,这里是传入文件流,也可以是QByteArray args.datafunc = [&output_file](minio::http::DataFunctionArgs df_args) -> bool { if (df_args.error) { std::cerr << "Error in data callback: " << df_args.error.message() << std::endl; return false; // 返回false表示停止处理 } // 将数据块写入文件 if (df_args.datachunk.size() > 0) { output_file.write(df_args.datachunk.data(), df_args.datachunk.size()); if (!output_file.good()) { std::cerr << "Error writing to output file." << std::endl; return false; } } return true; // 返回true表示继续处理下一个数据块 }; // 6. 执行下载操作 std::cout << "Downloading object '" << object_name << "' from bucket '" << bucket_name << "'..." << std::endl; minio::s3::GetObjectResponse resp = client.GetObject(args); // 7. 关闭文件 output_file.close(); // 8. 检查下载结果 if (!resp) { std::cerr << "Download failed: " << resp.Error().String() << std::endl; // 清理可能已经部分写入的文件 std::remove(output_filename.c_str()); return 1; } std::cout << "File downloaded successfully to '" << output_filename << "'." << std::endl; return 0; } catch (const std::exception& e) { std::cerr << "Exception occurred: " << e.what() << std::endl; return 1; } } ``` **解决方案:** == args.datafunc = [&output_file](minio::http::DataFunctionArgs df_args) -> bool 在这里回调函数中实现,该方法是同步阻塞,直到完成下载。== 编辑:myhappyandy
虚拟世界
2025年12月21日 15:23
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码