minio 整合springboot

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yiyi</groupId><artifactId>yiyi-miio</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath /></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.12</version></dependency></dependencies></project>

MinioConfig文件

package com.yiyi.config;import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author:zrf* @Date:2023/12/20 17:38* @description:minio上传工具类*/
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {/*** 服务地址*/private String endpoint;/*** 访问key*/private String accessKey;/*** 密钥*/private String secretKey;/*** 桶名称*/private String bucketName;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}

appliaction.yml 配置

server:port: 8089
minio:endpoint: http://127.0.0.1:9000bucketName: devaccessKey: minioadminsecretKey: minioadmin
spring:application:name: yiyi-minioservlet:multipart:max-file-size: 100MBmax-request-size: 100MBmvc:pathmatch:matching-strategy: ant_path_matcher

MinioUtils 工具类

package com.yiyi.util;import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import com.yiyi.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @Author:zrf* @Date:2023/12/19 17:38* @description:minio上传工具类*/
@Component
@Slf4j
public class MinioUtils {@Resourceprivate MinioConfig minioConfig;@Resourceprivate MinioClient minioClient;/*** 上传文件* @param file* @return*/public String upload(MultipartFile file) {String fileName = file.getOriginalFilename();try {fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"))+"-"+ UUID.randomUUID().toString().replaceAll("-","")+ fileName.substring(fileName.lastIndexOf("."));log.info("上传文件-文件名:{}", fileName);minioClient.putObject(PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());} catch (Exception e) {log.info("上传文件-失败:{}", e.getMessage());e.printStackTrace();return "上传文件失败";}String url = minioConfig.getEndpoint()+"/"+minioConfig.getBucketName()+"/"+fileName;log.info("上传文件-成功-url:{}", url);return url;}/*** 预览文件* @param fileName* @return*/public String preview(String fileName) {if (StrUtil.isEmpty(fileName)) return "fileName is not null";try {return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).method(Method.GET).build());}catch (Exception e){log.info("预览文件-失败: {}",e.getMessage());e.printStackTrace();return "预览文件-失败";}}/*** 下载* @param fileName* @param res*/public void download(String fileName, HttpServletResponse res) {if (StrUtil.isEmpty(fileName)) return;ByteArrayOutputStream out = null;try {GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build());out = new ByteArrayOutputStream();IoUtil.copy(objectResponse,out);res.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));res.setContentLength(out.toByteArray().length);res.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);try(ServletOutputStream stream = res.getOutputStream()){stream.write(out.toByteArray());stream.flush();}}catch (Exception e){log.info("下载文件-失败: {}",e.getMessage());e.printStackTrace();}finally {if (out != null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 检查存储桶是否存在** @param bucketName* @return* @throws Exception*/public boolean bucketExists(String bucketName) throws Exception {return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());}/*** 创建存储桶** @param bucketName* @return* @throws Exception*/public boolean makeBucket(String bucketName) throws Exception {boolean flag = bucketExists(bucketName);if (!flag) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info("minio存储桶创建成功:{}",bucketName);return true;} else {return false;}}
}

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

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

相关文章

如何快速优化大数据量订单表

场景 本篇分享以前在广州一家互联网公司工作时遇到的状况及解决方案,这家公司有一个项目是SOA的架构,这个架构那几年是很流行的,哪怕是现在依然认为这个理念在当时比较先进。 当时的项目背景大概是这样,这家公司用的是某软提供的方案,项目已经运行3年多,整体稳定。 数据…

IPSec的起源-基础知识都需要掌握

IPSec的起源 目的 出于安全考虑。 最开始的互联网是明文通信&#xff0c;很容易被监听、篡改。添加了如crc一类的校验也不能完全保证数据的安全。 在IP层专门做的安全防护。 为什么是IP层&#xff1f;在当时IP层可通信的范围最广、应用最多。 开始也是从MAC层开始&#xff0c;后…

var let const的区别和使用场景?

var、let 和 const 是 JavaScript 中用于声明变量的关键字&#xff0c;它们之间有着一些区别和各自的使用场景。 var 作用域&#xff1a;var是在函数作用域&#xff08;function scope&#xff09;内声明的变量&#xff0c;如果在函数内部声明则只在函数内部有效&#xff0c;在…

中金汇融配资分享在线杠杆炒股的安全知识

随着股市的火爆&#xff0c;越来越多的人选择加入杠杆炒股的行列。然而&#xff0c;对于许多新手来说&#xff0c;如何安全有效地使用杠杆炒股却是一个难题。今天&#xff0c;我们就来为大家分享一家专业、安全、靠谱的在线杠杆炒股平台——中金汇融&#xff0c;让你轻松掌握在…

mysql mha高可用

一、前言 在原本的一主两从数据库架构中&#xff0c;是没有高可用功能的&#xff0c;当主库挂了时不会自动将剩下的从从升级为主库&#xff0c;只能等待主库恢复才能使用&#xff0c;或者手动切换&#xff0c;但是手动切换后需要更改后端服务中的数据库地址信息&#xff0c;在此…

架构设计到底是什么?

文章目录 架构设计有哪些内容&#xff1f;架构原理与技术认知分布式技术原理与设计中间件常用组件的原理和设计问题数据库原理与设计问题分布式缓存原理与设计问题互联网高性能高可用设计问题 技术认知架构分析问题分析能力边界 架构设计&#xff0c;是中高级研发工程师逃不开的…

C# 获取Excel里引用的外部其他excel文件清单

关键方法:mySheet.Application.ActiveWorkbook.LinkSources(XlLink.xlExcelLinks); 主要代碼如下 Application myExcel null;//引用Excel Application类別 Workbook myBook null;//引用活页簿类別 Worksheet mySheet null;//引用工作表类別 …

软件设计模式:单例模式

文章目录 前言一、单例模式实现1.饿汉式静态变量方式静态代码块方式 2.懒汉式线程不安全线程安全双重检查锁静态内部类方式枚举方式 二、存在问题1.序列化反序列化2.反射破坏3.解决序列化破坏解决反射破坏解决 三、JDK源码解析总结 前言 单例模式&#xff08;Singleton Patter…

windows远程桌面怎么开启?

文章目录 如下三种开启方式&#xff0c;任选一即可方式1.在系统属性中开启远程桌面方式2.通过系统设置开启远程桌面方式3.注册表编辑器开启远程桌面使用远程桌面 如下三种开启方式&#xff0c;任选一即可 配合 组网工具或者内网穿透 超级爽 局域网其他pc如何访问宿主机虚拟机IP…

@RequestParam、@PathVariable、@RequestBody、@RequestAttribute详解

一、RequestParam注解 作用&#xff1a;用于将指定的请求参数赋值给方法中的形参。 属性&#xff1a; 1&#xff09;value&#xff1a;请求参数名&#xff08;必须配置&#xff09; 2&#xff09;required&#xff1a;是否必需&#xff0c;默认为 true&#xff0c;即请求中必须…

Elasticsearch:什么是文本分类?

文本分类定义 - text classification 文本分类是一种机器学习&#xff0c;它将文本文档或句子分类为预定义的类或类别。 它分析文本的内容和含义&#xff0c;然后使用文本标签为其分配最合适的标签。 文本分类的实际应用包括情绪分析&#xff08;确定评论中的正面或负面情绪&…

GLTF/GLB模型在线预览、编辑、动画查看以及材质修改

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预…

Linux docker安装nacos

1&#xff1a;首先下载安装docker&#xff0c;这里不做描述&#xff0c;可以自行百度安装。 2&#xff1a;通过docker下载nacos&#xff0c; docker pull nacos/nacos-server:latest3&#xff1a;搭建临时nacos容器&#xff0c;此步骤的目的是为了获取nacos的配置文件和日志 …

Ubuntu 常用命令之 awk 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 AWK是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。在Ubuntu系统下&#xff0c;AWK命令主要用于数据处理和生成报告。 AWK命令的参数主要有 -F&#xff1a;指定输入文件分隔符&#xff0c;FS变量就是指定输入字…

【华为OD题库-094】最佳的出牌方法-java

题目 手上有一副扑克牌&#xff0c;每张牌按牌面数字记分(J11,Q12,K13&#xff0c;没有大小王)&#xff0c;出牌时按照以下规则记分: 出单张&#xff0c;记牌面分数&#xff0c;例如出一张2&#xff0c;得分为2 出对或3张&#xff0c;记牌面分数总和再x2&#xff0c;例如出3张3…

根据excel中的数据信息批量修改图片名称

背景说明 接了一个需求&#xff0c;需要将批量图片按照指定的需求进行重命名&#xff0c;本来的图片是以身份证号进行命名的.jpg文件&#xff0c;现在需要统一命名为班级姓名身份证号.png格式的文件。其中&#xff0c;用户提供了一张导出的excel数据表(data.xlsx)&#xff0c;数…

Salesforce回归后:谁在成为中国市场上的CRM首选?

怎样的C RM才是在中国这片土地上的最佳答案&#xff1f; 在Salesforce重新回归的今天&#xff0c;其所面临的产品、生态、技术、服务、数据等问题也恰是中国本土的CRM厂商被多年磨练和审视的问题。 在如Salesforce等国外软件进军中国市场的同时&#xff0c;中国本土的CRM厂商…

《漫画算法》笔记——给定数,求删除k个数字后的最小值

/*** 题目&#xff1a;给定一个数&#xff0c;求 删除k个数字后的最小值* 思路&#xff1a;考虑 “如何删除一个数字&#xff0c;得到最小值”&#xff0c;* 不难想到&#xff0c;应该优先删除“靠前&#xff0c;值大”的数字&#xff0c;* 观察到&#xff1a;如果一个数字大于…

深度学习14—注意力机制与自注意力机制

注&#xff1a;以下均为个人学习笔记&#xff0c;发布只为方便学习阅读&#xff0c;若觉侵权&#xff0c;请联系删除&#xff01;&#xff01; 1.李沐老师课堂学习理解笔记 1.1 随意线索和不随意线索 1.2 注意力机制 通过注意力池化层来有偏向性的选择某些输入。 1.3 注意力…

Linux 音视频SDK开发实践

一、兼容性适配处理 为什么需要兼容处理&#xff1f; 1、c兼容处理 主要有ABI兼容性问题&#xff0c;不同ubuntu系统依赖的ABI版本如下&#xff1a; ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…