当前位置: 首页 > news >正文

springboot 集成minio 实现文件上传

引入依赖
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.0</version>
</dependency>

因为我是后端开发需要使用knife4j

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.orchids</groupId><artifactId>springmybatisplus</artifactId><version>0.0.1-SNAPSHOT</version><name>springmybatisplus</name><description>springmybatisplus</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version><knife4j.version>4.1.0</knife4j.version><mybatis-plus.version>3.5.6</mybatis-plus.version><minio.version>8.2.0</minio.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>${knife4j.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>${minio.version}</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><compilerArgs><arg>-parameters</arg></compilerArgs><source>15</source><target>15</target></configuration></plugin></plugins></build></project>
编写配置信息
minio:endpoint: http://localhost:9000access-key: minioadminsecret-key: minioadminbucket-name: lovehouse
获取配置信息
  • 编写实体类
package com.orchids.springmybatisplus.common.minio;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;/*** @Author qwh* @Date 2024/6/1 9:54*/
@Data
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {private String endpoint;private String accessKey;private String secretKey;private String bucketName;
}
编写配置文件 交给spring 管理 获取实体类信息
package com.orchids.springmybatisplus.common.minio;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author qwh* @Date 2024/6/1 9:48*/
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {@Autowiredprivate MinioProperties minioProperties;@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint(minioProperties.getEndpoint()).credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()).build();}
}
controller
package com.orchids.springmybatisplus.web.controller;import com.orchids.springmybatisplus.model.result.Result;
import com.orchids.springmybatisplus.web.service.FileService;
import io.minio.errors.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;/*** @Author qwh* @Date 2024/6/1 10:07*/
@Tag(name = "文件上传")
@RestController
@RequestMapping("/file")
public class FileUpLoadController {@Autowiredprivate FileService fileService;@Operation(summary = "文件上传")@PostMapping("upload")public Result<String> upload(@RequestParam MultipartFile file) {//接口改造try {String url = fileService.upload(file);return Result.ok(url);} catch (Exception e) {return Result.fail();}}
}
service
package com.orchids.springmybatisplus.web.service;import io.minio.errors.*;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;/*** @Author qwh* @Date 2024/6/1 10:17*/
public interface FileService {String upload(MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;
}

实现类

package com.orchids.springmybatisplus.web.service.impl;import com.orchids.springmybatisplus.common.minio.MinioConfiguration;
import com.orchids.springmybatisplus.common.minio.MinioProperties;
import com.orchids.springmybatisplus.web.service.FileService;
import io.minio.*;
import io.minio.errors.*;
import okhttp3.internal.io.FileSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;/*** @Author qwh* @Date 2024/6/1 10:18*/
@Service
public class FileServiceImpl implements FileService {@Autowiredprivate MinioClient minioClient;@Autowiredprivate MinioProperties minioProperties;@Overridepublic String upload(MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {boolean bucketed = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());if (!bucketed) {// 创建桶minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());//设置文件唯一名称// 设置桶的读写权限minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(minioProperties.getBucketName()).config(createBucketPolicyConfig(minioProperties.getBucketName())).build());}// 上传文件String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();minioClient.putObject(PutObjectArgs.builder().bucket(minioProperties.getBucketName()).object(filename).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);}private String createBucketPolicyConfig(String bucketName) {return """{"Statement" : [ {"Action" : "s3:GetObject","Effect" : "Allow","Principal" : "*","Resource" : "arn:aws:s3:::%s/*"} ],"Version" : "2012-10-17"}""".formatted(bucketName);}
}

相关文章:

  • 特别实用的8个机器学习算法总结!建议收藏,反复观看!
  • C++操纵符用法
  • 《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相
  • 【Linux】在Windows环境下配置两台Linux机器的文件互传
  • simulink基础学习笔记
  • 零基础学Java第二十七天之前端-HTML5详解
  • Golang编程语言:深度探索与应用实践
  • 521源码-源码下载-个人网盘源码2024最新web网盘系统源码一键安装版源码分享
  • [每周一更]-(第99期):MySQL的索引为什么用B+树?
  • openssl 常用命令demo
  • matlab GUI界面设计
  • openVPN+SmartDNS=openDNS or smartVPN?
  • 关于FPGA 使用SPI FLASH固化时如何配置固化参数
  • 多线程基础知识-
  • 游戏逆向工具分析及解决方案
  • axios 和 cookie 的那些事
  • C++类中的特殊成员函数
  • Codepen 每日精选(2018-3-25)
  • CSS 提示工具(Tooltip)
  • JavaScript的使用你知道几种?(上)
  • Javascript设计模式学习之Observer(观察者)模式
  • JDK9: 集成 Jshell 和 Maven 项目.
  • leetcode388. Longest Absolute File Path
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux中的硬链接与软链接
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python中eval与exec的使用及区别
  • Rancher-k8s加速安装文档
  • Redis 中的布隆过滤器
  • Theano - 导数
  • 每天一个设计模式之命令模式
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Golang中select的用法
  • 如何使用 JavaScript 解析 URL
  • 学习JavaScript数据结构与算法 — 树
  • 用 Swift 编写面向协议的视图
  • scrapy中间件源码分析及常用中间件大全
  • UI设计初学者应该如何入门?
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #pragma once
  • (1)Nginx简介和安装教程
  • (2)STM32单片机上位机
  • (2)空速传感器
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (六)激光线扫描-三维重建
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)ObjectiveC 深浅拷贝学习
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 成都线下面基会拉开序幕
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题