SpringBoot整合minio服务
这里我选用的是JDK1.8 + SpringBoot2.3.12.RELEASE
一、导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
二、导入工具类
注意:需要在 endpoint、bucketName、accessKey、secretKey 中指定配置信息
import io.minio.*;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class MinioUtil {
// minio服务器ip
private String endpoint="http://192.168.31.208:5000";
// 桶名
private String bucketName="minio-test";
// access key
private String accessKey="minio-test";
// secret key
private String secretKey="minio-test";
/**
* @param fileInputStream 要上传文件的输入流
* @param minioFileName 推送到minio之后的名称
* @return
*/
public String upload(InputStream fileInputStream, String minioFileName){
// 1. 拿到minio客户端
MinioClient minioClient= MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey,secretKey)
.build();
// 2. 判断bucket是否存在,若不存在,则创建bucket
try {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}catch (Exception e) {
e.printStackTrace();
};
// 3. 上传文件
try {
minioClient.putObject(PutObjectArgs.builder()
.object(minioFileName)
.bucket(bucketName)
.stream(fileInputStream, fileInputStream.available(), -1)
.build());
}catch (Exception e){
e.printStackTrace();
System.out.println("上传失败");
return null;
}
String url=endpoint+"/"+bucketName+"/"+minioFileName;
return url;
}
/**
* @param multipartFile 要上传的文件
* @param minioFileName 要上传到minio的文件名
* @return
*/
public String upload(MultipartFile multipartFile, String minioFileName){
String url=null;
try {
url = upload(multipartFile.getInputStream(),minioFileName);
} catch (IOException e) {
e.printStackTrace();
}
return url;
}
/**
* @param multipartFile 要上传的文件
*/
public String upload(MultipartFile multipartFile){
String url=null;
try {
String minioFileName = UUID.randomUUID() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));
url = upload(multipartFile.getInputStream(),minioFileName);
} catch (IOException e) {
e.printStackTrace();
}
return url;
}
/**
* 下载文件
* @param fromMinioFileName 要下载的minio中的文件名
* @param toLocalFileName 下载到本地的位置
*/
public void download(String fromMinioFileName,String toLocalFileName){
// 1.创建minio客户端
MinioClient minioClient = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey,secretKey)
.build();
// 2.判断桶是否存在
try {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){
System.out.println(bucketName+" 这个桶不存在!");
return;
}
} catch (Exception e) {
e.printStackTrace();
}
// 3.下载文件
try {
minioClient.downloadObject(DownloadObjectArgs.builder()
.bucket(bucketName).object(fromMinioFileName).filename(toLocalFileName)
.build());
} catch (Exception e) {
e.printStackTrace();
System.out.println(fromMinioFileName+" 下载失败!");
}
}
}
三、在application.yml文件里添加配置
上传视频时,有的视频内存过大,需要在配置文件中配置最大文件内存上限
spring:
servlet:
multipart:
max-file-size: 200MB # 文件的最大尺寸100MB
max-request-size: 200MB # 单次请求可以接收文件的最大尺寸为100MB,一般上传视频时会用到
四、上传文件的控制层Controller
import com.xxx.springminio.util.MinioUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class MinioTestController {
@Autowired
private MinioUtil minioUtil;
@PostMapping("/upload")
public String upload(MultipartFile file) throws IOException {
return minioUtil.upload(file);
}
}