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内容

相关推荐
IT_陈寒2 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
顺风尿一寸3 小时前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
流浪克拉玛依3 小时前
Go Web 服务限流器实战:从原理到压测验证 --使用 Gin 框架 + Uber Ratelimit / 官方限流器,并通过 Vegeta 进行性能剖析
后端
程途知微3 小时前
JVM运行时数据区各区域作用与溢出原理
java
孟沐3 小时前
保姆级教程:手写三层架构 vs MyBatis-Plus
后端
星浩AI3 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
华仔啊6 小时前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康6 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫7 小时前
TCP和UDP区别
后端
千寻girling7 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试