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


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

    源码地址

    重要配置和代码

    MinIO配置

    1. pom文件引入依赖

      
      <dependency>
          <groupId>io.miniogroupId>
          <artifactId>minioartifactId>
          <version>8.5.9version>
      dependency>
      
    2. application.yaml配置文件自定义配置

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

      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配置类

    @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();
        }
    }
    
    

    核心代码

    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内容
      在这里插入图片描述

  • 相关阅读:
    RN应用中的路由导航
    pom.xml常见依赖及其作用
    关于app推广和留存用户,建议你这样做
    [LeetCode] 最后一个单词的长度【58】
    内网穿透的应用-如何通过TortoiseSVN+内网穿透,实现公网提交文件到内网SVN服务器?
    Dubbo(二):Dubbo 2.x 基础配置 Xml 方式、注解方式 和 高级特性
    Golang | Leetcode Golang题解之第207题课程表
    IDEA查看类型层次结构(Type Hierarchy)
    等保2.0 测评 linux服务器加固 基本安全配置手册
    您还在使用 JSF 吗
  • 原文地址:https://blog.csdn.net/yang2330648064/article/details/139456572