文件上传微服务
首先创建一个配置文件用于存储mini服务端配置信息
min.io.endpoint =
min.io.accessKey =
min.io.secretKey =
min.io.bucket =
之后创建一个资源类读取配置文件
@PropertySource
用于寻找要加载properties文件目录
@ConfigurationProperties
寻找propeties中自动添加前缀 之后只要在类中添加properties文件中去除前缀的key即可 然后添加get set方法
package com.lyra.utils.extend;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:minio.properties")
@ConfigurationProperties(prefix = "min.io")
public class MinioResources {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucket;
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
}
之后就可以写工具类了
将配置资源类注入
sdk常用命令
创建一个客户端用于操作minio
MinioClient minioClient =
MinioClient.builder()
.endpoint("https://play.min.io")
.credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
.build();
文件上传 传入bucket名称和上传的文件名称和文件流即可完成上传
如果要传入的是目录 可以在目录添加 \ 在本业务中我们根据的用户id和传入的文件名称来设置上传文件的目录 以用户的id为目录 目录下存储的用户上传的文件
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioResources.getBucket())
.object(folderAndFileName)
.stream(fileSteam, size, -1).build());
工具类的思想: 首先创建一个client用于操作minio
之后执行文件上传
上传完毕后根据文件名称 host bucket进行拼接 返回上传文件的url
package com.lyra.utils;
import com.lyra.exception.GraceException;
import com.lyra.result.ResponseStatusEnum;
import com.lyra.utils.extend.MinioResources;
import io.minio.*;
import io.minio.http.Method;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.io.FileInputStream;
import java.io.InputStream;
@Component
public class MinioUtils {
@Autowired
private MinioResources minioResources;
public String uploadFile(InputStream fileSteam, String folderAndFileName, Long size) {
try {
MinioClient minioClient = MinioClient.builder()
.endpoint(minioResources.getEndpoint())
.credentials(minioResources.getAccessKey(), minioResources.getSecretKey()).build();
// 上传文件
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioResources.getBucket())
.object(folderAndFileName)
.stream(fileSteam, size, -1).build());
return minioResources.getEndpoint() + minioResources.getBucket() + "/" + folderAndFileName;
} catch (Exception e) {
GraceException.display(ResponseStatusEnum.UPLOAD_FAILED);
e.printStackTrace();
}
GraceException.display(ResponseStatusEnum.GET_FILE_IMAGE_URL_FAILED);
return null;
}
}
创建文件微服务
导入依赖 因为要创建controller所以要导入api 因为要使用minio utils和统一返回需要common
<dependencies>
<dependency>
<groupId>com.lyra</groupId>
<artifactId>news-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.lyra</groupId>
<artifactId>news-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>
</dependencies>
编写启动类 启动类要将所有路径都扫描到才可以使用swagger
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = {"com.lyra"})
public class FileServiceApplication {
public static void main(String[] args) {
SpringApplication.run(FileServiceApplication.class, args);
}
}
上传的大小限制为500KB
maxFileSize
是单个文件大小
maxRequestSize
是设置总上传的数据大小
server:
port: 8004
spring:
redis:
host: 127.0.0.1
port: 6379
password: 990728
database: 0
application:
name: service-file
servlet:
multipart:
max-file-size: 512000
max-request-size: 512000
创建service
业务流程
根据controller中传入multipartFile
将文件路径拼接 根据用户id来创建目录
获取流和size大小传入到工具类中
最后将文件路径返回给controoler
@Service
public class UploadServiceImpl implements UploadService {
@Autowired
private MinioUtils minioUtils;
@Override
public String uploadFile(MultipartFile multipartFile, String userId) throws IOException {
String fileName = multipartFile.getOriginalFilename();
if (StringUtils.isNotBlank(fileName) && StringUtils.isNotBlank(userId)) {
String filePathAndFileName = userId + "/" + fileName;
return minioUtils.uploadFile(
multipartFile.getInputStream(),
filePathAndFileName,
multipartFile.getSize());
} else {
GraceException.display(ResponseStatusEnum.FILE_UPLOAD_NULL_ERROR);
return null;
}
}
}
controoler 业务思路
判断 usertId和上传文件是否为空 若不为空调入service类进行上传 上传成功后将url返回给前端
@RestController
public class FileController implements FileControllerAPI {
private static final Logger log = LoggerFactory.getLogger(FileController.class);
@Autowired
private UploadService uploadService;
@Override
public GraceJSONResult uploadFace(String userId, @RequestParam("file") MultipartFile multipartFile) throws IOException {
if (multipartFile != null && StringUtils.isNotBlank(userId)) {
String fileUrl = uploadService.uploadFile(multipartFile, userId);
log.info("upload file path:{}", fileUrl);
return GraceJSONResult.ok(fileUrl);
}
return GraceJSONResult.errorCustom(ResponseStatusEnum.UPLOAD_FAILED);
}
}
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律