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

相关推荐
WaaTong10 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_7430484410 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries12 分钟前
Java字节码增强库ByteBuddy
java·后端
佳佳_27 分钟前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
小灰灰__32 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭36 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
许野平2 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono