SpringBoot整合MinIO
今天因为公司的需求接触到这个东西,我们先来看下MinIO的官网简介
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
字面意思 MinIO是一个文件存储服务 支持分布式,以及可搭建集群,单体项目所以不考虑集群,下面我们来安装它,我所在的环境为Linux
.https://dl.min.io/server/minio/release/linux-amd64/minio
.chmod +x minio
./minio server /data

这是启动好的样子,然后我们在浏览器里访问

让你填写AK和SK,把刚刚打印在控制台上的输入即可,如果想要修改的话通过以下方式可修改
export MINIO_ACCESS_KEY=AK
export MINIO_ACCESS_KEY=SK

登录成功后在页面右下角点击创建桶,也就是我们的文件夹

创建好后我们就直接可以来上传了,但我们的目前是在SpringBoot程序当中进行上传下载
首先我们来添加依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>

由于项目的原因我并没有把信息配置在YAML里面,可自行根据自己场景配置
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.kzwl.comm.advice.Consts;
import org.springframework.web.multipart.MultipartFile; import java.io.InputStream;
import java.util.List; /**
* Minio工具类
*/
@Slf4j
public class MinIoUtil { public static MinioClient minioClient; /**
* 初始化minio配置
*
* @param :
* @return: void
* @date : 2020/8/16 20:56
*/
@PostConstruct
public static void init() {
try {
log.info("Minio Initialize........................"); minioClient = MinioClient.builder().endpoint(Consts.Minio.Url).credentials(Consts.Minio.AccessKey,Consts.Minio.SecretKey).build();
createBucket(Consts.Minio.BucketName);
log.info("Minio Initialize........................successful");
} catch (Exception e) {
e.printStackTrace();
log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());
}
} /**
* 判断 bucket是否存在
*
* @param bucketName:
* 桶名
* @return: boolean
*/
@SneakyThrows(Exception.class)
public static boolean bucketExists(String bucketName) {
return minioClient.bucketExists(bucketName);
} /**
* 创建 bucket
*
* @param bucketName:
* 桶名
* @return: void
*/
@SneakyThrows(Exception.class)
public static void createBucket(String bucketName) {
boolean isExist = minioClient.bucketExists(bucketName);
if (!isExist) {
minioClient.makeBucket(bucketName);
}
} /**
* 获取全部bucket
*
* @param :
* @return: java.util.List<io.minio.messages.Bucket>
*/
@SneakyThrows(Exception.class)
public static List<Bucket> getAllBuckets() {
return minioClient.listBuckets();
} /**
* 文件上传
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param filePath:
* 文件路径
* @return: void
*/
@SneakyThrows(Exception.class)
public static void upload(String bucketName, String fileName, String filePath) {
minioClient.putObject(bucketName, fileName, filePath, null);
} /**
* 文件上传
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param stream:
* 文件流
* @return: java.lang.String : 文件url地址
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, String fileName, InputStream stream) {
minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
return getFileUrl(bucketName, fileName);
} /**
* 文件上传
*
* @param bucketName:
* 桶名
* @param file:
* 文件
* @return: java.lang.String : 文件url地址
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, MultipartFile file) {
final InputStream is = file.getInputStream();
final String fileName = file.getOriginalFilename();
minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
is.close();
return getFileUrl(bucketName, fileName);
} /**
* 删除文件
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @return: void
*/
@SneakyThrows(Exception.class)
public static void deleteFile(String bucketName, String fileName) {
minioClient.removeObject(bucketName, fileName);
} /**
* 下载文件
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param response:
* @return: void
*/
// @SneakyThrows(Exception.class)
// public static void download(String bucketName, String fileName, HttpServletResponse response) {
// // 获取对象的元数据
// final ObjectStat stat = minioClient.statObject(bucketName, fileName);
// response.setContentType(stat.contentType());
// response.setCharacterEncoding("UTF-8");
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// InputStream is = minioClient.getObject(bucketName, fileName);
// IOUtils.copy(is, response.getOutputStream());
// is.close();
// } /**
* 获取minio文件的下载地址
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @return: java.lang.String
* @date : 2020/8/16 22:07
*/
@SneakyThrows(Exception.class)
public static String getFileUrl(String bucketName, String fileName) {
return minioClient.presignedGetObject(bucketName, fileName);
} }
MinIO相对操作还是很简单,当然这是针对单机操作,如果并发量大的话,可考虑配置集群!
如有侵权请联系作者删除!
SpringBoot整合MinIO的更多相关文章
- SpringBoot 整合MinIO
引入依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifact ...
- spring-boot整合mybatis(1)
sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot整合mq接收消息队列
继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...
- springboot整合mybaits注解开发
springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
- SpringBoot整合SpringCloud搭建分布式应用
什么是SpringCloud? SpringCloud是一个分布式的整体解决方案.SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应 ...
随机推荐
- C#LeetCode刷题-二叉搜索树
二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III 19.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 327 区间和的个数 29.5% 困难 3 ...
- Vulnhub篇Photographerr
0x00 靶机信息 靶机:Photographerr:1 难度:中 下载:https://www.vulnhub.com/entry/photographer-1,519/ 0x01 信息收集 靶场网 ...
- 设计模式实战系列之@Builder和建造者模式
前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...
- Jdk1.7下的HashMap源码分析
本文主要讨论jdk1.7下hashMap的源码实现,其中主要是在扩容时容易出现死循环的问题,以及put元素的整个过程. 1.数组结构 数组+链表 示例图如下: 常量属性 /** * The defau ...
- start-stop-daemon: matching on world-writable pidfile /var/run/redis/redis-server.pid is insecurefailed
Microsoft Store上 看到最新的Ubuntu 20.04 LTS 已经适配到WSL上了, 于是卸载了老版本 18.04 LTS,安装上了最新版本的. 第一次启动会比较慢,需耐心等待 Ins ...
- 微信DLL劫持反弹shell复现
(该文参考网络他人资料,仅为学习,不许用于非法用途) 一.操作环境 Windows7 : 微信 , Process Explorer(任务管理工具,本实验中用于查找微信程序调用的DLL文件) Ka ...
- javaWeb项目之图书管理系统(附视频讲解)
视频播放地址:javaWeb图书系统 本系统为"Swing项目之图书管理系统"(此源码已共享)的Web版,网页框架用采用EasyUI 数据库为MysqL,写Web项目摒弃了火狐浏览 ...
- 推荐一款万能抓包神器:Fiddler Everywhere
搞IT技术的同行,相信没有几个人是不会抓包这项技能的(如果很不幸你中枪了,那希望这篇文章给你一些动力),市面上的抓包工具也有很多,常用的有:Charles.Fiddler.Burpsuite.Wire ...
- HP Probook 4230s 更换 CPU 过程
HP Probook 4230s 更换 CPU 过程 原来使用的 CPU 是 i5-2540M 更换为 i7-2760QM 1.松开 硬盘线 硬盘线插头上有一片黑色的胶片,可以用来拔起插头 硬盘 ...
- JavaScript基础语法资料
JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...