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

相关推荐
爱码少年23 分钟前
springboot中责任链模式之简单应用
spring boot·责任链模式
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05671 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
武昌库里写JAVA1 小时前
【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等
spring boot·spring·毕业设计·layui·课程设计
_oP_i2 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康2 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘3 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意3 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
刘大辉在路上4 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理