引入依赖
1 2 3 4 5 6
| <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.0</version> </dependency>
|
因为我是后端开发需要使用knife4j
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| <?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>
|
编写配置信息
1 2 3 4 5
| minio: endpoint: http://localhost:9000 access-key: minioadmin secret-key: minioadmin bucket-name: lovehouse
|
获取配置信息
- 编写实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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;
@Data @ConfigurationProperties(prefix = "minio") public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName; }
|
编写配置文件 交给spring 管理 获取实体类信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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;
@Configuration @EnableConfigurationProperties(MinioProperties.class) public class MinioConfiguration { @Autowired private MinioProperties minioProperties; @Bean public MinioClient minioClient(){ return MinioClient.builder().endpoint(minioProperties.getEndpoint()).credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()).build(); } }
|
controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| 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;
@Tag(name = "文件上传") @RestController @RequestMapping("/file") public class FileUpLoadController { @Autowired private 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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;
public interface FileService { String upload(MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException; }
|
实现类1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| 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;
@Service public class FileServiceImpl implements FileService { @Autowired private MinioClient minioClient; @Autowired private MinioProperties minioProperties;
@Override public 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); } }
|