前期准备
需要先安装minio文件服务器,请参考我上一篇文章
pom.xml 版本
本次使用的是springboot2.7.16 版本,
minio 版本是8.2.2
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.16</version>
<relativePath/>
</parent>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
配置minio服务
minio.endpoint=**********
minio.accessKey=******
minio.secretKey=*******
minio.bucketName=shuangningzixun
# 单个文件上传的最大值
spring.servlet.mutipart.max-file-size=200MB
# 整个请求体上传的文件大小
spring.servlet.mutipart.max-request-size=500MB
其中endpoint 为本地安装的minio服务地址,形式为IP+端口
accessKey和secretKey为用户名密码
桶名称则是在minio服务上新增的桶名称。
minio配置类
package com.example.demo.config;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
/**
* 访问地址
*/
@Value("${minio.endpoint}")
private String endpoint;
/**
* accessKey类似于用户ID,用于唯一标识你的账户
*/
@Value("${minio.accessKey}")
private String accessKey;
/**
* secretKey是你账户的密码
*/
@Value("${minio.secretKey}")
private String secretKey;
/**
* 默认存储桶
*/
@Value("${minio.bucketName}")
private String bucketName;
@Bean
public MinioClient minioClient() {
MinioClient minioClient = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
return minioClient;
}
}
minio配置实体类
package com.example.demo.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix="minio")
@Component
@Getter
@Setter
public class Minio {
private String url;
private String username;
private String password;
private String bucketName;
}
minio下载服务类
package com.example.demo.service;
import com.example.demo.config.Minio;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Component
public class MinioService {
@Autowired
private MinioClient minioClient;
@Autowired
private Minio minio;
public String uploadFile(MultipartFile file) throws IOException {
//判断捅是否存在
String url=null;
try {
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs
.builder().bucket(minio.getBucketName()).build());
if (!bucketExists){
//如果不存在,就创建捅
minioClient.makeBucket(MakeBucketArgs.builder().
bucket(minio.getBucketName()).build());
}
String yyyyMMdd = LocalDateTime.now().
format(DateTimeFormatter.ofPattern("yyyy-mm-dd"));
String uuid = UUID.randomUUID().toString();
String filename = yyyyMMdd +"/"+file.getOriginalFilename();
//
minioClient.putObject(PutObjectArgs.builder().
bucket(minio.getBucketName())
.object(uuid).stream(file.getInputStream(),file.getSize(),-1)
.contentType(file.getContentType()).build());
url = minio.getUrl()+"/"+minio.getBucketName()+"/"+filename;
return url;
} catch (Exception e) {
}finally {
file.getInputStream().close();
}
return url;
}
}
minio 上传文件工具类
package com.example.demo.utils;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.InputStream;
@Component
public class MinioUtils {
@Autowired
private MinioClient minioClient;
public InputStream getObject(String bucketName, String objectName) throws Exception {
return minioClient.getObject(GetObjectArgs.builder()
.bucket(bucketName).object(objectName).build());
}
}
文件控制器
package com.example.demo.controller;
import com.example.demo.common.ApiResult;
import com.example.demo.config.Minio;
import com.example.demo.service.MinioService;
import com.example.demo.utils.MinioUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
@Autowired
private MinioService minioService;
@Autowired
private MinioUtils minioUtils;
@Autowired
private Minio minio;
/**
* 文件上传接口
*/
@PostMapping("/upload")
public ApiResult<Void> upload(@RequestParam("file")MultipartFile multipartFile) throws Exception{
minioService.uploadFile(multipartFile);
return null;
}
/**
* 文件下载接口
*/
@GetMapping("/download")
public void download(@RequestParam("fileName")String fileName,
HttpServletResponse response) {
try {
InputStream fileInputStream = minioUtils.getObject(minio.getBucketName(),fileName);
response.setHeader("Content-Disposition","attachment;filename="+fileName);
response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
IOUtils.copy(fileInputStream,response.getOutputStream());
} catch (Exception e) {
log.info("下载失败",e);
}
}
}
postman测试
可以在minio控制台查询到已经上传的文件。
到此一个简单的文件上传下载服务就算成功了