文件上传微服务

首先创建一个配置文件用于存储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为目录 目录下存储的用户上传的文件
image
image

            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;
    }
}

创建文件微服务
image
导入依赖 因为要创建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);
    }
}
posted @   RainbowMagic  阅读(220)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示