手把手教你SpringBoot轻松整合Minio
作者:何裕华 发布时间:2022-07-24 14:00:37
标签:SpringBoot,整合,Minio
目录
前言
一、技术介绍
1.Minio是什么?
二、使用步骤
1.引入maven库
2.封装Minio
3.配置文件
4.单元测试
总结
前言
使用Spring Boot 可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以。
提示:以下是本篇文章正文内容,下面案例可供参考
一、技术介绍
1.Minio是什么?
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
二、使用步骤
1.引入maven库
代码如下(示例):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
</dependencies>
2.封装Minio
IFile类:
package com.hyh.minio;
/**
* File接口类
*
* @Author: heyuhua
* @Date: 2021/1/12 10:33
*/
public interface IFile {
/**
* 上传
*
* @param filename 文件名
*/
void upload(String filename);
/**
* 上传
*
* @param filename 文件名
* @param object 保存对象文件名称
*/
void upload(String filename, String object);
}
File接口类:
package com.hyh.minio.service;
import com.hyh.minio.IFile;
/**
* File接口
*
* @Author: heyuhua
* @Date: 2021/1/12 10:53
*/
public interface FileService extends IFile {
/**
* 上传
*
* @param filename 文件名称
* @param object 保存对象文件名称
* @param bucket 存储桶
*/
void upload(String filename, String object, String bucket);
}
File接口实现类:
package com.hyh.minio.service.impl;
import com.hyh.minio.service.FileService;
import com.hyh.utils.common.StringUtils;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* 文件接口服务实现
*
* @Author: heyuhua
* @Date: 2021/1/12 10:53
*/
@Service
public class FileServiceImpl implements FileService {
/**
* 日志
*/
private static final Logger LOG = LoggerFactory.getLogger(FileServiceImpl.class);
/**
* minio 客户端
*/
@Autowired
private MinioClient minioClient;
/**
* 默认存储桶名称
*/
@Value("${minio.bucketName:}")
private String defaultBucketName;
@Override
public void upload(String filename) {
uploadObject(filename, null, defaultBucketName);
}
@Override
public void upload(String filename, String object) {
uploadObject(filename, object, defaultBucketName);
}
@Override
public void upload(String filename, String object, String bucket) {
uploadObject(filename, object, bucket);
}
/**
* 上传
*
* @param filename
* @param object
* @param bucket
*/
private void uploadObject(String filename, String object, String bucket) {
if (StringUtils.isAnyBlank(filename, bucket))
return;
try {
//存储桶构建
bucketBuild(bucket);
//保存的文件名称
object = StringUtils.isBlank(object) ? filename.substring(filename.lastIndexOf("/") > 0 ? filename.lastIndexOf("/") : filename.lastIndexOf("\\")) : object;
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket(bucket)
.object(object)
.filename(filename)
.build());
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException exception) {
LOG.error("uploadObject error", exception);
}
}
/**
* 存储桶构建
*
* @param bucketName
*/
private void bucketBuild(String bucketName) {
try {
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
LOG.info("Bucket " + bucketName + " make success.");
} else {
LOG.info("Bucket " + bucketName + " already exists.");
}
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException exception) {
LOG.error("bucketBuild error", exception);
}
}
public String getDefaultBucketName() {
return defaultBucketName;
}
public void setDefaultBucketName(String defaultBucketName) {
this.defaultBucketName = defaultBucketName;
}
}
Minio配置类:
package com.hyh.minio.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: heyuhua
* @Date: 2021/1/12 10:42
*/
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
/**
* endPoint是一个URL,域名,IPv4或者IPv6地址
*/
private String endpoint;
/**
* 端口
*/
private int port;
/**
* accessKey类似于用户ID,用于唯一标识你的账户
*/
private String accessKey;
/**
* secretKey是你账户的密码
*/
private String secretKey;
/**
* 如果是true,则用的是https而不是http,默认值是true
*/
private Boolean secure;
/**
* 默认存储桶
*/
private String bucketName;
/**
* 配置目录
*/
private String configDir;
@Bean
public MinioClient getMinClient() {
return MinioClient.builder()
.endpoint(endpoint, port, secure)//http
.credentials(accessKey, secretKey)
.build();
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public Boolean getSecure() {
return secure;
}
public void setSecure(Boolean secure) {
this.secure = secure;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getConfigDir() {
return configDir;
}
public void setConfigDir(String configDir) {
this.configDir = configDir;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
Minio助手类封装:
package com.hyh.minio.helper;
import com.hyh.minio.service.FileService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
/**
* Minio助手
*
* @Author: heyuhua
* @Date: 2021/1/12 10:54
*/
@Component
public class MinioHelper {
/**
* 日志
*/
private static final Logger LOG = LoggerFactory.getLogger(MinioHelper.class);
/**
* 文件接口服务
*/
@Autowired
private FileService fileService;
/**
* 上传
*
* @param filename
*/
public void upload(String filename) {
Assert.notNull(filename, "filename is null.");
fileService.upload(filename);
}
/**
* 上传
*
* @param filename
* @param object
*/
public void upload(String filename, String object) {
Assert.notNull(filename, "filename is null.");
Assert.notNull(object, "object is null.");
fileService.upload(filename, object);
}
/**
* 上传
*
* @param filename
* @param object
* @param bucket
*/
public void upload(String filename, String object, String bucket) {
Assert.notNull(filename, "filename is null.");
Assert.notNull(object, "object is null.");
Assert.notNull(bucket, "bucket is null.");
fileService.upload(filename, object, bucket);
}
}
3.配置文件
代码如下(示例):
server:
port: 8088
#minio配置
minio:
endpoint: 39.108.49.252
port: 9000
accessKey: admin
secretKey: admin123
secure: false
bucketName: "hyh-bucket"
configDir: "/home/data/"
4.单元测试
测试代码如下(示例):
package com.hyh.core.test;
import com.hyh.core.test.base.HyhTest;
import com.hyh.minio.helper.MinioHelper;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Minio Test
*
* @Author: heyuhua
* @Date: 2021/1/12 11:54
*/
public class MinioTest extends HyhTest {
@Autowired
private MinioHelper minioHelper;
@Test
public void testUpload() {
//直接指向你本地的路径测试
String filename = "E:\\home\\static\\img\\fsPic\\0c34de99ac6b4c56812e83c4eab13a6f.jpg";
String object = "hyh-test-name.jpg";
String bucket = "hyh-test-bucket";
minioHelper.upload(filename);
minioHelper.upload(filename, object);
minioHelper.upload(filename, object, bucket);
//上传完后打开浏览器访问 http://ip:9000 登录控制台可查看上传的文件
}
@Test
@Override
public void test() {
System.out.println("---minio 测试---");
}
}
总结
是不是感觉很简单?关注我带你揭秘更多Minio高级用法 源码地址:点此查看源码.
来源:https://juejin.cn/post/6922265977329549326


猜你喜欢
- 微服务通过feign.RequestInterceptor传递参数Feign 支持请求 * ,在发送请求前,可以对发送的模板进行操作,例如设
- Android Service 详细介绍:1、Service的概念 2、Service的生命周期 3、实例:控制音乐播放的Service一、
- 提示:这里可以添加本文要记录的大概内容:例如:一般系统前端调用后台相关功能接口时,需要验证此时用户的权限是否满足调用该接口的条件,因此我们需
- 多段颜色的进度条实现思路,供大家参考,具体内容如下这个进度条其实相对简单. 这里可以把需要绘制的简单分为两个部分1.灰色背景部分 2.多段颜
- 1、背景当我们的hadoop集群运行了一段时间之后,各个DataNode上的数据分布并不一定是均匀分布的。比如说: 我们向现有集群中添加了一
- Thread dumps(线程转储)能帮助我们判断 CPU 峰值、死锁、内存异常、应用反应迟钝、响应时间变长和其他系统问题。一些在线的分析工
- 1 顺序结构顺序结构比较简单,就是代码一行一行的执行,本节之前写的所有代码都是顺序结构。例如:public static void main
- 前言打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘。下载打包工
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.优先队列优先队列 (Priority Queue) 和队
- 一、Jsoup的主要功能Jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API
- Flutter有个悠久的传统,便是运行flutter create并删除所有内容,然后在所有标准样板文件(boilerplate)当中尽力复
- 废话不多说了,直接给大家贴java代码了。具体代码如下所示:/*支付流程*//****Controller.java 代码如下:*/@Req
- 前言:在 Spring 中, IOC 是很重要的概念,其本质就是 map 结构,存储容器和业务 Be
- 我就废话不多说啦,还是直接看代码吧!/** * 设置数据库是否自动提交事务 * @param flag
- 本文介绍了Android Studio 超级简单的打包生成apk,分享给大家,也给自己留个笔记。为什么要打包:apk文件就是一个包,打包就是
- 本文实例为大家分享了Android PickerScrollView滑动选择控件的具体使用代码,供大家参考,具体内容如下先看一下效果图1.S
- 前言前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们
- 问题学习完maven后,用maven创建了一个web项目,然后在这个web项目中创建了一个java文件夹并标记这个目录为源码根目录,当我准备
- 我们在实际开发中,有的时候需要储存或者备份比较复杂的数据。这些数据的特点是,内容多、结构大,比如短信备份等。我们知道SharedPrefer
- 本文实例讲述了在Linux上运行C#的方法。分享给大家供大家参考。具体方法如下:在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个