Spring Boot前后端简单集成MinIo开发

Spring Boot前后端简单集成MinIo开发

源码地址

重要配置和代码

MinIO配置

  1. pom文件引入依赖

    xml 复制代码
    <!-- minio -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.5.9</version>
    </dependency>
  2. application.yaml配置文件自定义配置

    yaml 复制代码
    #自定义 minio相关配置
    minio:
      endpoint: http://192.168.1.18:9000
      accessKey: minioadmin
      secretKey: minioadmin
      bucket: user-bucket
  3. 新建配置对象类

    java 复制代码
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Data
    @Component
    @ConfigurationProperties(prefix = "minio")
    public class MinIOInfo {
    
        private String endpoint;
        private String accessKey;
        private String secretKey;
        private String bucket;
    
    }
  4. 编写MinIo配置类

java 复制代码
@Configuration
public class Config {

    @Resource
    private MinIOInfo minIOInfo;

    //单例的MinioClient对象没有线程安全问题
    @Bean
    public MinioClient minioClient() {
        //链式编程,构建MinioClient对象
        return MinioClient.builder()
                .endpoint(minIOInfo.getEndpoint())
                .credentials(minIOInfo.getAccessKey(), minIOInfo.getSecretKey())
                .build();
    }
}

核心代码

bash 复制代码
import com.yang.minioBackend.config.MinIOInfo;
import com.yang.minioBackend.entity.UserInfo;
import com.yang.minioBackend.result.R;
import com.yang.minioBackend.service.UserContractService;
import com.yang.minioBackend.service.UserImageService;
import com.yang.minioBackend.service.UserInfoService;
import io.minio.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

@RestController
@CrossOrigin
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;

    @Resource
    private UserImageService userImageService;

    @Resource
    private UserContractService userContractService;

    @Resource
    private MinioClient minioClient;

    @Resource
    private MinIOInfo minIOInfo;

    @GetMapping(value = "/api/users")
    public R users(){
        List<UserInfo> list = userInfoService.list();
        return R.OK(list);
    }

    /**
     * 上传图片
     */
    @PostMapping(value = "/api/user/image")
    public R uploadImage(MultipartFile file, @RequestParam(value = "id") Long id) throws Exception {
        //例如 1234.jpg 获取文件类型 jpg
        // file.getOriginalFilename().indexOf(".") 原始文件名中查找第一个出现的 . 的位置
        // file.getOriginalFilename().substring(...) 从文件名中提取从索引 4 开始到结尾的所有字符,即从第一个.后开始的所有字符。
        String subFix = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf("."));
        String object = id+subFix;

        // 上传图片到 MinIO
        ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
                .bucket(minIOInfo.getBucket()) // 配置桶名称
                .object(object) //设置对象名
                .stream(file.getInputStream(), file.getSize(), -1) //文件流
                .build()
        );

        System.out.println(objectWriteResponse);

        boolean res = userImageService.saveOrUpdateUserImage(id, minIOInfo.getBucket(), object);

        return R.OK(res);
    }

    /**
     * 上传合同
     * @param file 文件
     * @param id id
     */
    @PostMapping(value = "/api/user/contract")
    public R contract(MultipartFile file, @RequestParam(value = "id") Long id) throws Exception {
        //1234.jpg 同uploadImage
        String subFix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().indexOf("."));
        String object = id+subFix;
        ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
                .bucket(minIOInfo.getBucket())
                .object(object)
                .stream(file.getInputStream(), file.getSize(), -1)
                .build()
        );
        System.out.println(objectWriteResponse);
        //更新用户合同记录表
        boolean res = userContractService.saveOrUpdateUserContract(id, minIOInfo.getBucket(), object);
        return R.OK(res);
    }

    /**
     * 查询数据库
     */
    @GetMapping(value = "/api/user/{id}")
    public R user(@PathVariable(value = "id") Integer id) {
        return R.OK(userInfoService.getUserById(id));
    }

    /**
     * 更新用户信息
     */
    @PutMapping(value = "/api/user")
    public R updateUser(UserInfo userInfo) {
        return userInfoService.updateById(userInfo) ? R.OK() : R.FAIL();
    }

    /**
     * 合同文件下载
     * @param id 用户id
     * @param response 返回结果封装
     */
    @GetMapping(value = "/api/download/{id}")
    public void download(@PathVariable(value = "id") Integer id, HttpServletResponse response) throws Exception {

        //查询数据库获取 用户信息 桶信息 和文件对象信息
        UserInfo userInfo = userInfoService.getUserById(id);

        String bucket = userInfo.getUserContractDO().getBucket();
        String object = userInfo.getUserContractDO().getObject();

        //后端设置一下响应头信息,方便浏览器弹出下载框
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(object, StandardCharsets.UTF_8));
        // 从minion获取合同文件数据
        GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucket)
                .object(object)
                .build());

        getObjectResponse.transferTo(response.getOutputStream());
    }

    // 删除用户信息
    @DeleteMapping(value = "/api/user/{id}")
    public R delUser(@PathVariable(value = "id") Integer id) {
        try {
            boolean del = userInfoService.delUserById(id);
            return del ? R.OK() : R.FAIL();
        } catch (Exception e) {
            e.printStackTrace();
            return R.FAIL();
        }
    }

}

最终效果

  • 前端内容

  • mysql记录

  • MinIo内容

相关推荐
Magic--10 分钟前
深入解析管道:最基础的进程间通信(IPC)实现
java·服务器·unix
JOEH6018 分钟前
Java 后端开发中的内存泄漏问题:90% 开发者都会踩的 5 个坑
后端
_野猪佩奇_牛马版18 分钟前
多智能体协作 - 使用 LangGraph 子图实现
后端
JOEH6019 分钟前
为什么你的数据库连接总超时?99% 的 Java 程序员都踩过这 5 个坑
后端
后端不背锅20 分钟前
对外接口设计完全指南:安全、高性能、可演进
后端
IT小崔36 分钟前
SqlSugar 使用教程
数据库·后端
Oneslide37 分钟前
Docker Compose 重启 RabbitMQ 数据丢失?
后端
架构师沉默39 分钟前
为什么国外程序员都写独立博客,而国内都在公众号?
java·后端·架构
开心就好202543 分钟前
Win11 抓包工具怎么选?网页请求与设备流量抓取
后端·ios
带刺的坐椅1 小时前
SolonCode v2026.4.1 发布(比 ClaudeCode 简约的编程智能体)
java·ai·llm·agent·solon-ai·claudecode·soloncode