springboot 集成 MinIo 文件服务器

1.添加依赖

dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.1.0</version>
</dependency>

2. 集成springboot 并提供工具类

import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;@Component
@RequiredArgsConstructor
public class MinioTemplate implements InitializingBean {/*** minio地址+端口号*/@Value("${minio.url}")private  String url;/*** minio用户名*/@Value("${minio.accessKey}")private  String accessKey;/*** minio密码*/@Value("${minio.secretKey}")private  String secretKey;/*** 文件桶的名称*/@Value("${minio.bucketName}")private String bucketName;private MinioClient minioClient;@Overridepublic void afterPropertiesSet() throws Exception {Assert.hasText(url, "Minio url 为空");Assert.hasText(accessKey, "Minio accessKey为空");Assert.hasText(secretKey, "Minio secretKey为空");this.minioClient = new MinioClient(url, accessKey, secretKey);}/*** 创建bucket** @param bucketName bucket名称*/@SneakyThrowspublic void createBucket(String bucketName) {if (!minioClient.bucketExists(bucketName)) {minioClient.makeBucket(bucketName);}}/*** 获取全部bucket* <p>* https://docs.minio.io/cn/java-client-api-reference.html#listBuckets*/@SneakyThrowspublic List<Bucket> getAllBuckets() {return minioClient.listBuckets();}/*** 根据bucketName获取信息** @param bucketName bucket名称*/@SneakyThrowspublic Optional<Bucket> getBucket(String bucketName) {return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();}/*** 根据bucketName删除信息** @param bucketName bucket名称*/@SneakyThrowspublic void removeBucket(String bucketName) {minioClient.removeBucket(bucketName);}/*** 根据文件前置查询文件** @param bucketName bucket名称* @param prefix     前缀* @param recursive  是否递归查询* @return MinioItem 列表*/@SneakyThrowspublic List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {List<Item> list = new ArrayList<>();Iterable<Result<Item>> objectsIterator = minioClient.listObjects(bucketName, prefix, recursive);if (objectsIterator != null) {Iterator<Result<Item>> iterator = objectsIterator.iterator();if (iterator != null) {while (iterator.hasNext()) {Result<Item> result = iterator.next();Item item = result.get();list.add(item);}}}return list;}/*** 获取文件外链** @param bucketName bucket名称* @param objectName 文件名称* @param expires    过期时间 <=7* @return url*/@SneakyThrowspublic String getObjectURL(String bucketName, String objectName, Integer expires) {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}return minioClient.presignedGetObject(bucketName, objectName, expires);}/*** 获取文件路径* @param bucketName * @param fileName* @return*/@SneakyThrowspublic String getObjectURL(String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}return minioClient.getObjectUrl(bucketName, fileName);}/*** 获取文件** @param bucketName bucket名称* @param objectName 文件名称* @return 二进制流*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName) {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}return minioClient.getObject(bucketName, objectName);}/*** 获取文件* @param bucketName* @param objectName* @return*/@SneakyThrowspublic ObjectStat statObject(String bucketName, String objectName) {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}return minioClient.statObject(bucketName, objectName);}/*** 上传文件** @param bucketName bucket名称* @param objectName 文件名称* @param stream     文件流* @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject*/public void putObject(String bucketName, String objectName,InputStream stream,int length) throws Exception {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), length));//minioClient.putObject(bucketName, objectName, stream, length,stream.available(), "application/octet-stream");}/*** 上传文件** @param bucketName  bucket名称* @param objectName  文件名称* @param stream      文件流* @param size        大小* @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject*/public void putObject(String bucketName, String objectName, InputStream stream, long size) throws Exception {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}// client.putObject(bucketName, objectName, stream, size, contextType);minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));}/*** 获取文件信息, 如果抛出异常则说明文件不存在** @param bucketName bucket名称* @param objectName 文件名称* @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject*/public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}return minioClient.statObject(bucketName, objectName);}/*** 删除文件** @param bucketName bucket名称* @param objectName 文件名称* @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject*/public void removeObject(String bucketName, String objectName) throws Exception {if (StringUtils.isEmpty(bucketName)) {bucketName = this.bucketName;}minioClient.removeObject(bucketName, objectName);}
}

4. 配置信息

## minio文件系统
minio.url=http://localhost:9000
minio.accessKey=minioadmin
minio.secretKey=minioadmin
minio.bucketName=mhpt

5. crud 示例

import cn.com.result.JsonResult;
import cn.com.sys.exception.BusinessException;
import cn.com.util.MinioTemplate;
import io.minio.ObjectStat;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;/*** minio上传,下载,删除接口*/
@RestController
@RequestMapping("/minio")
public class MinioController {@Autowiredprivate MinioTemplate minioTemplate;/*** 下载文件*/@ApiOperation(value = "下载文件")@GetMapping(value = "/download")@SneakyThrows(Exception.class)public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) {ObjectStat stat = minioTemplate.statObject("", fileName);response.setContentType(stat.contentType());response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));InputStream in = minioTemplate.getObject("", fileName);IOUtils.copy(in, response.getOutputStream());in.close();}/*** 上传文件* @param file* @return* @throws Exception Exception*/@ApiOperation(value = "上传文件")@PostMapping(value = "/upload")@SneakyThrows(Exception.class)public JsonResult upload(@RequestParam("file") MultipartFile file) throws Exception {if (file.isEmpty()) {throw new BusinessException("上传文件不能为空");} else {// 得到文件流final InputStream is = file.getInputStream();// 文件名final String fileName = file.getOriginalFilename();// 把文件放到minio的boots桶里面minioTemplate.putObject("",fileName,is,-1);String objectUrl = minioTemplate.getObjectURL("",fileName);// 关闭输入流is.close();return JsonResult.ok(objectUrl);}}/*** 删除文件* @author 溪云阁* @param fileName* @return JsonResult*/@ApiOperation(value = "删除文件")@GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@SneakyThrows(Exception.class)public JsonResult delete(@RequestParam("fileName") String fileName) {minioTemplate.removeObject("",fileName);return JsonResult.ok("删除成功");}}

6.MinIO dashboard 信息

1. 访问地址: http://localhost:9000/
2. 账户/密码: minioadmin/minioadmin

7. 官网网址

https://www.min.io/

8.参考文档

Go:         https://docs.min.io/docs/golang-client-quickstart-guide
Java:       https://docs.min.io/docs/java-client-quickstart-guide
Python:     https://docs.min.io/docs/python-client-quickstart-guide
JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
.NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide

springboot 集成MinIo 文件服务器相关推荐

  1. spring cloud 文件服务器,SpringBoot集成MinIO文件服务器

    docker-compose安装minio version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/minio:late ...

  2. Springboot项目集成Minio文件服务器(下)

    Springboot项目集成Minio文件服务器(下) 1.配置依赖 在pom文件里面配置Minio的相关依赖. <!--添加minio的依赖--><dependency>&l ...

  3. SpringBoot笔记:SpringBoot集成MinIO分布式文件系统

    文章目录 搭建MinIO集群 SpringBoot集成 添加依赖 添加配置 获取MinioClient MinioUtils完整工具类 测试代码 搭建MinIO集群 首先搭建MinIO的分布式集群,集 ...

  4. SpringBoot集成MinIo实现资源库功能

    项目背景 要实现一个资源库的功能,实现图片.文件.视频等资源的上传和下载. 项目git地址,还没完全完成 https://github.com/zhumengting/resource-managem ...

  5. minio的安装和springboot集成minio

    文章目录 1.什么是minio 1.1 minio的优点 1.2 MinIO的基础概念 1.3 纠删码EC (Erasure Code) 1.4 存储形式 1.5 存储方案 2 MinIO环境搭建 2 ...

  6. SpringBoot集成Minio搭建自己的分布式文件服务器(Minio集成篇)

    目录 1.导入依赖 2.创建spring boot工程,工程名为springboot-minio 3.配置minio配置文件 4.创建配置类MinioConfig 5.创建Minio工具类MinioU ...

  7. spring-boot整合FTP文件服务器

    @TOC一 一,扫盲篇:什么是FTP? FTP 服务器是支持 FTP协议的服务器.在电脑中安装FTP工具将电脑中的数据传输到服 务器当中,这时服务器就称为FTP服务器,而我们的电脑称为客户端.对于FT ...

  8. Springboot 集成积木报表(jimuReport)

    Springboot 集成积木报表(jimuReport) 搭建maven项目 引入积木报表所需pom依赖(jimureport所需的,mybatis-plus所需3以上) <parent> ...

  9. springboot 使用 minio

    springboot 使用 minio yml 配置 yml 配置 # ====================== ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ ================ ...

最新文章

  1. python输入若干个整数试找出其中的最大数和最小数_Python编程的若干个经典小技巧...
  2. 超详细的Python matplotlib 绘制直方图 赶紧收藏
  3. redis客户端jedis连接和spring结合
  4. android音乐播放器文章,Android复习09【内容提供者、音乐播放器】
  5. andriod studio 运行 无结果_无负压静音供水设备下篇一
  6. String转int,int转String
  7. 修改完/etc/fstab后重新挂载方法
  8. php地址选择插件,微信小程序中关于三级联动地址选择器的实例分享
  9. 用汇编的眼光看C++(之 总结篇)
  10. mysql忘记root密码安装_MySql忘记root密码的解决方法
  11. 51单片机C语言编程100例pdf,51单片机C语言编程100例.doc
  12. 发送手机验证码登录(使用榛子云短信平台)
  13. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了
  14. 免费作图软件draw.io 软件输入数学公式和文本
  15. Pano Flutter SDK 全新发布,跨平台音视频开发更easy
  16. 银行大数据应用案例(研讨会整理)
  17. jmeter查看平均响应时间_线上服务平均响应时间太长,怎么排查?
  18. Unity 3D 中的专业“术语表”。
  19. 任务卡片优先级排序-Leangoo看板工具
  20. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收

热门文章

  1. Jasperreport_6.18的吐血记录五之柱形图
  2. python--mysql--驱动简介和使用
  3. 端口被占用时怎么解决?
  4. 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症
  5. 2014计算机基础知识,2014年计算机基础知识练习题240_甘肃中公教育
  6. python中os.path.join()的循环用法_python中使用os.path.join()
  7. leetcode526 优美的排列
  8. RIP实验(详细步骤)
  9. 荐书:理解知识图谱必看的那些书、公众号和其他资料
  10. Oracle取小数点部分