SpringBoot项目集成MinIO

news/2025/1/13 15:59:27/文章来源:https://www.cnblogs.com/songweipeng/p/18519805

一、MinIO的下载安装以及基本使用

1.下载地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

2.下载好后需要手动创建data文件夹用于存储MinIO中的数据 

3.键入cmd

 4. 设置MinIO的一些变量(第一次启动需要配置)

set MINIO_ROOT_USER=adminset MINIO_ROOT_PASSWORD=admin123set MINIO_ACCESS_KEY=adminset MINIO_SECRET_KEY=admin123

5.下面是我踩的坑,如果只设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值,而不设置MINIO_ACCESS_KEY和MINIO_SECRET_KEY的值,当启动minio服务的时候就会报以下异常:

 所以一定要设置好后面两个变量的值。

6. 启动minio服务

minio.exe server data

 7.进入登录页面后,输入对应的用户名和密码,也就是之前设置的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值。

8. 进入主界面后,点击左侧导航栏中的Buckets,然后点击Create Bucket。

 9.进入该桶,点击upload,上传一个文件,桶的默认权限是private,所以外界访问不到,需要修改访问权限为public,但是要注意安全问

 点击左侧导航栏中的Buckets,进入该桶,修改权限为public,这样外界就可以访问上传的文件了。

二. SpringBoot集成MinIO

1.引入依赖

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.0.2</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version>
</dependency>

2.编写配置文件

server:port: 8080
spring:# 配置文件上传大小限制servlet:multipart:max-file-size: 200MBmax-request-size: 200MB
minio:host: http://127.0.0.1:9000 # 访问地址url: ${minio.host}/${minio.bucket}/  # 对象存储服务的urlaccess-key: minioadmin # 登录账号secret-key: minioadmin # 登录账号密码bucketName: test-bucket # 文件桶的名称bucket: public  // 权限

3.编写minio配置类

@Configuration
public class MinIoClientConfig {/*** minio配置*/@Value("${minio.url}")private String endpoint;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucketName}")private String bucketName;/*** 注入minio客户端** @return minio客户端对象*/@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}

4.编写minio工具类

@Component
public class MinioUtil {/*** minio配置*/@Value("${minio.url}")private String endpoint;@Autowiredprivate MinioClient minioClient;/*** 创建一个桶*/public void createBucket(String bucket) throws Exception {boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());if (!found) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());}}/*** 上传一个文件*/public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName).stream(stream, -1, 10485760).build());System.out.println(objectWriteResponse.object() + " is uploaded successfully.");}/*** 列出所有的桶*/public List<String> listBuckets() throws Exception {List<Bucket> list = minioClient.listBuckets();List<String> names = new ArrayList<>();list.forEach(b -> {names.add(b.name());});return names;}/*** 列出一个桶中的所有文件和目录*/public List<Fileinfo> listFiles(String bucket) throws Exception {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).recursive(true).build());List<Fileinfo> infos = new ArrayList<>();results.forEach(r->{Fileinfo info = new Fileinfo();try {Item item = r.get();info.setFilename(item.objectName());info.setDirectory(item.isDir());info.setFilepath(endpoint+"/"+bucket+"/"+item.objectName());infos.add(info);} catch (Exception e) {e.printStackTrace();}});return infos;}/*** 下载一个文件*/public InputStream download(String bucket, String objectName) throws Exception {InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(objectName).build());return stream;}/*** 删除一个桶*/public void deleteBucket(String bucket) throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());}/*** 删除一个对象*/public void deleteObject(String bucket, String objectName) throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());}/*** 复制文件*/public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {this.createBucket(targetBucket);minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject).source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());}/*** 获取文件信息*/public String getObjectInfo(String bucket, String objectName) throws Exception {return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();}/*** 生成一个给HTTP GET请求用的presigned URL。* 浏览器/移动端的客户端可以用这个URL进行下载,* 即使其所在的存储桶是私有的。*/public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();return minioClient.getPresignedObjectUrl(build);}/*** 获取minio中所有的文件*/public List<Fileinfo> listAllFile() throws Exception {List<String> list = this.listBuckets();List<Fileinfo> fileinfos = new ArrayList<>();for (String bucketName : list) {fileinfos.addAll(this.listFiles(bucketName));}return fileinfos;}
}

5.编写文件实体类

@Data
public class Fileinfo {String filename;String filepath;Boolean directory;
}

6.编写接口响应实体

@Data
public class ResultData<T> {public static final Integer SUCCESS_CODE = 200;public static final Integer FAIL_CODE = 4000;public static final String SUCCESS_MESSAGE = "操作成功";public static final String FAIL_MESSAGE = "操作失败";/*** 返回状态码*/private Integer code;/*** 返回信息*/private String message;/*** 返回数据*/private T data;public ResultData() {}public static <T> ResultData<T> success() {ResultData<T> resultUtil = new ResultData<>();resultUtil.setCode(SUCCESS_CODE);resultUtil.setMessage(SUCCESS_MESSAGE);return resultUtil;}public static <T> ResultData<T> success(T data) {ResultData<T> resultUtil = success();resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> success(String message, T data) {ResultData<T> resultUtil = success();resultUtil.setMessage(message);resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> success(Integer code, String message, T data) {ResultData<T> resultUtil = new ResultData<>();resultUtil.setCode(code);resultUtil.setMessage(message);resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> success(Integer code, String message,Integer count, T data) {ResultData<T> resultUtil = new ResultData<>();resultUtil.setCode(code);resultUtil.setMessage(message);resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> fail() {ResultData<T> resultUtil = new ResultData<>();resultUtil.setCode(FAIL_CODE);resultUtil.setMessage(FAIL_MESSAGE);return resultUtil;}public static <T> ResultData<T> fail(T data) {ResultData<T> resultUtil = fail();resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> fail(String message, T data) {ResultData<T> resultUtil = fail();resultUtil.setMessage(message);resultUtil.setData(data);return resultUtil;}public static <T> ResultData<T> fail(Integer code, String message) {ResultData<T> resultUtil = fail();resultUtil.setCode(code);resultUtil.setMessage(message);return resultUtil;}public static <T> ResultData<T> fail(Integer code, String message, T data) {ResultData<T> resultUtil = new ResultData<>();resultUtil.setCode(code);resultUtil.setMessage(message);resultUtil.setData(data);return resultUtil;}public void setCode(int code){this.code = code;}public int getCode(){return this.code;}public void setMessage(String message){this.message = message;}public String getMessage(){return message;}public void setData(T data){this.data = data;}public T getData(){return data;}
}

7.创建minio控制器

/*** minio相关接口** @author songwp* @date 2024/11/11 11:28*/
@RestController
@RequestMapping("minio")
public class MinioController {@AutowiredMinioUtil minioUtil;/*** 文件上传** @param file 文件* @param bucket 桶名* @param objectName 对象名* @return 是否成功* @throws Exception*/@RequestMapping(value = "/upload", method = RequestMethod.POST)public ResultData upload(@RequestParam MultipartFile file,@RequestParam String bucket,@RequestParam(required = false) String objectName) throws Exception {minioUtil.createBucket(bucket);if (objectName != null) {minioUtil.uploadFile(file.getInputStream(), bucket, objectName + "/" + file.getOriginalFilename());} else {minioUtil.uploadFile(file.getInputStream(), bucket, file.getOriginalFilename());}return ResultData.success();}/*** 获取文件信息* @param bucket 桶名* @return 是否成功*/@RequestMapping(value = "/getFile", method = RequestMethod.GET)public ResultData getFile(@RequestParam ("bucket")String bucket){try {List<Fileinfo> fileinfos = minioUtil.listFiles(bucket);return ResultData.success(fileinfos);} catch (Exception e) {throw new RuntimeException(e);}}/*** 文件下载** @param bucket 桶名* @param objectName 对象名* @return 是否成功*/@GetMapping("download")public ResultData download(@RequestParam("bucket") String bucket,@RequestParam("objectName") String objectName){try {InputStream download = minioUtil.download(bucket, objectName);return ResultData.success();} catch (Exception e) {throw new RuntimeException(e);}}/*** 获取文件信息** @param bucket 桶名* @param objectName 对象名* @return 是否成功*/@GetMapping("getObjectInfo")public ResultData getObjectInfo(@RequestParam("bucket") String bucket,@RequestParam("objectName") String objectName) throws Exception {String objectInfo = minioUtil.getObjectInfo(bucket, objectName);String objectStat = objectInfo.replaceAll("ObjectStat", "");return ResultData.success(objectStat);}/*** 生成一个给HTTP GET请求用的presigned URL。** @param bucket 桶名* @param objectName 对象名* @return 是否成功*/@GetMapping("getObjectUrl")public ResultData getObjectUrl(@RequestParam("bucket") String bucket,@RequestParam("objectName") String objectName) throws Exception {String url = minioUtil.getPresignedObjectUrl(bucket, objectName,7200);return ResultData.success(url);}/*** 列出所有的桶*/@RequestMapping(value = "/listBuckets", method = RequestMethod.GET)public ResultData listBuckets() throws Exception {return ResultData.success(minioUtil.listBuckets());}/*** 获取minio中所有的文件*/@RequestMapping(value = "/listAllFile", method = RequestMethod.GET)public ResultData listAllFile() throws Exception {return ResultData.success(minioUtil.listAllFile());}
}

8.postman接口调用实例

9.最后查看test-bucket桶中是否有刚才上传的文件就可以了。如果有则表明你的项目已经成功集成minio了

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle与GreatSQL差异:更改唯一索引列

Oracle与GreatSQL差异:更改唯一索引列 1.问题来源 在从Oracle迁移到GreatSQL的应用系统中,一条普通的update语句在GreatSQL中却报错,需要进行SQL语句的改写。把实际问题简化为下面简单情况进行说明。 在Oracle下,可以正常执行的update语句。 -- 建表 CREATE TABLE test.tes…

PVE7.1虚拟机安装黑群晖教程

本教程基于Proxmox VE(PVE)7.1虚拟机环境下安装群晖,兼容这块简单说明:Intel酷睿四代以下或者志强处理器建议安装Ds3615-3617-3266等版本,四代以上可以安装918-920等版本,如果你啥都不知道,安装Ds3615就对了。安装步骤1.先删除删除local-lvm分区,    具体教程PVE虚拟…

项目经理如何进行项目绩效评估

项目经理进行项目绩效评估是通过设定标准、跟踪进度、分析结果和整改措施等步骤完成的。在这个过程中,项目经理需要对各个关键绩效指标(KPIs)进行监控和评价,这样可以确保项目符合既定目标和标准。设定标准是项目绩效评估的基础,它为项目的成功定义了清晰的轨迹。 设定标准…

SMART Utility中文激活安装包 SMART Utility MacOS硬盘检测下载地址

SMART Utility是一款专为Mac OS X设计的硬盘健康状态检测工具。它利用先进的自我监测、分析与报告技术(SMART),实时监测硬盘的温度、转速、错误率等关键参数,全面评估硬盘健康状况。该软件能及时发现并预警硬盘中的潜在问题,如坏道、机械故障等,并提供详细的报告功能,帮…

JuiceFS CSI:Mount Pod 的平滑升级及其实现原理

当集群中需要升级 Mount Pod 时,目前推荐的方式是更新配置后重新挂载应用 Pod 进行滚动升级,但这种升级方式的问题在于需要业务重启。 如果对业务的使用模式很清楚时,比如没有数据写入等,也可以选择手动重建 Mount Pod 的方式。在更新配置后,手动删除已有的 Mount Pod,并…

博客搭建之路:hexo博客显示阅读时间和字数

hexo博客显示阅读时间和字数 hexo版本5.0.2 npm版本6.14.7 next版本7.8.hexo博客显示阅读时间和字数hexo版本5.0.2 npm版本6.14.7 next版本7.8.0效果如下在博客目录下安装npm install hexo-symbols-count-time --save 在_config.yml中加入配置 symbols_count_time:#文章内是否…

【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!

10月29日,在公安部科技信息化局、公安部装备财务局指导下,由公安部第一研究所主办,鼎桥通信技术有限公司、OpenHarmony生态委员会及公共安全专委会协办的警用鸿蒙开发者大会在北京胜利召开。10月29日,在公安部科技信息化局、公安部装备财务局指导下,由公安部第一研究所主办…

如何进行能源效率优化?

优化能源效率需要遵循以下步骤:1.识别并分析能源消费者;2.设定优化目标;3.选择适当的优化策略;4.实施技术改进措施;5.持续监控和反馈。进行能源效率优化的起点是明确能源使用的主要领域。1. 识别并分析能源消费者 进行能源效率优化的第一步是了解能源的主要消费者。这包括…

laravel11:中间件传递参数

一,官方的文档: 参考地址: https://docs.golaravel.com/docs/middleware二,演示: 功能:一个中间件负责验证用户是否已登录, 传递参数的作用是:在已登录基础是否验证真人身份核验,值为1时要核验,其他情况可以不用 1, 为中间件注册一个别名: bootstrap/app.php->…

css渐变背景的顶级用法:linear-gradient()

background-image:linear-gradient(110deg, rgb(1, 228, 161) 49%, rgb(0, 0, 0) 2% 51%, rgb(226, 237, 251) 49%);linear-gradient详解: 简单实例:从头部开始的线性渐变,从红色开始,转为黄色,再到蓝色: background-image: linear-gradient(red, yellow, blue); linear-g…