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

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

  • 源码地址
  • 重要配置和代码
  • MinIO配置
  • 核心代码
  • 最终效果
  • 源码地址

  • minioStudy
  • 重要配置和代码

    MinIO配置

    1. pom文件引入依赖

      <!-- minio -->
      <dependency>
          <groupId>io.minio</groupId>
          <artifactId>minio</artifactId>
          <version>8.5.9</version>
      </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内容

  • 作者:缘友一世

    物联沃分享整理
    物联沃-IOTWORD物联网 » Spring Boot集成MinIo实现前后端简单开发

    发表回复