springboot 集成MinIo 文件服务器
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 文件服务器相关推荐
- spring cloud 文件服务器,SpringBoot集成MinIO文件服务器
docker-compose安装minio version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/minio:late ...
- Springboot项目集成Minio文件服务器(下)
Springboot项目集成Minio文件服务器(下) 1.配置依赖 在pom文件里面配置Minio的相关依赖. <!--添加minio的依赖--><dependency>&l ...
- SpringBoot笔记:SpringBoot集成MinIO分布式文件系统
文章目录 搭建MinIO集群 SpringBoot集成 添加依赖 添加配置 获取MinioClient MinioUtils完整工具类 测试代码 搭建MinIO集群 首先搭建MinIO的分布式集群,集 ...
- SpringBoot集成MinIo实现资源库功能
项目背景 要实现一个资源库的功能,实现图片.文件.视频等资源的上传和下载. 项目git地址,还没完全完成 https://github.com/zhumengting/resource-managem ...
- minio的安装和springboot集成minio
文章目录 1.什么是minio 1.1 minio的优点 1.2 MinIO的基础概念 1.3 纠删码EC (Erasure Code) 1.4 存储形式 1.5 存储方案 2 MinIO环境搭建 2 ...
- SpringBoot集成Minio搭建自己的分布式文件服务器(Minio集成篇)
目录 1.导入依赖 2.创建spring boot工程,工程名为springboot-minio 3.配置minio配置文件 4.创建配置类MinioConfig 5.创建Minio工具类MinioU ...
- spring-boot整合FTP文件服务器
@TOC一 一,扫盲篇:什么是FTP? FTP 服务器是支持 FTP协议的服务器.在电脑中安装FTP工具将电脑中的数据传输到服 务器当中,这时服务器就称为FTP服务器,而我们的电脑称为客户端.对于FT ...
- Springboot 集成积木报表(jimuReport)
Springboot 集成积木报表(jimuReport) 搭建maven项目 引入积木报表所需pom依赖(jimureport所需的,mybatis-plus所需3以上) <parent> ...
- springboot 使用 minio
springboot 使用 minio yml 配置 yml 配置 # ====================== ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ ================ ...
最新文章
- python输入若干个整数试找出其中的最大数和最小数_Python编程的若干个经典小技巧...
- 超详细的Python matplotlib 绘制直方图 赶紧收藏
- redis客户端jedis连接和spring结合
- android音乐播放器文章,Android复习09【内容提供者、音乐播放器】
- andriod studio 运行 无结果_无负压静音供水设备下篇一
- String转int,int转String
- 修改完/etc/fstab后重新挂载方法
- php地址选择插件,微信小程序中关于三级联动地址选择器的实例分享
- 用汇编的眼光看C++(之 总结篇)
- mysql忘记root密码安装_MySql忘记root密码的解决方法
- 51单片机C语言编程100例pdf,51单片机C语言编程100例.doc
- 发送手机验证码登录(使用榛子云短信平台)
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了
- 免费作图软件draw.io 软件输入数学公式和文本
- Pano Flutter SDK 全新发布,跨平台音视频开发更easy
- 银行大数据应用案例(研讨会整理)
- jmeter查看平均响应时间_线上服务平均响应时间太长,怎么排查?
- Unity 3D 中的专业“术语表”。
- 任务卡片优先级排序-Leangoo看板工具
- Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
热门文章
- Jasperreport_6.18的吐血记录五之柱形图
- python--mysql--驱动简介和使用
- 端口被占用时怎么解决?
- 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症
- 2014计算机基础知识,2014年计算机基础知识练习题240_甘肃中公教育
- python中os.path.join()的循环用法_python中使用os.path.join()
- leetcode526 优美的排列
- RIP实验(详细步骤)
- 荐书:理解知识图谱必看的那些书、公众号和其他资料
- Oracle取小数点部分