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:9000accessKey: minioadminsecretKey: minioadminbucket: 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 {@Resourceprivate MinIOInfo minIOInfo;//单例的MinioClient对象没有线程安全问题@Beanpublic 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 {@Resourceprivate UserInfoService userInfoService;@Resourceprivate UserImageService userImageService;@Resourceprivate UserContractService userContractService;@Resourceprivate MinioClient minioClient;@Resourceprivate 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;// 上传图片到 MinIOObjectWriteResponse 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 同uploadImageString 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内容
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言之排序】-------六大排序

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日 前言&#xff1a; 今天我们就给大家带来几种排序的讲解&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&…

揭秘成都跃享未来教育:安全靠谱,打造教育新未来?

在当今这个信息爆炸的时代&#xff0c;教育行业的变革日新月异&#xff0c;各种教育机构如雨后春笋般涌现。其中&#xff0c;成都跃享未来教育咨询有限公司以其独特的教育理念和创新的教学模式&#xff0c;吸引了众多家长和学生的目光。那么&#xff0c;这家公司到底安不安全&a…

湖南(广告效果测评)源点调研 广告对消费者行为的影响效果

湖南&#xff08;市场调研&#xff09;源点咨询认为&#xff1a;调查在市场中是一个万万不可忽视的环节。 产品在问世之前要认真地调查&#xff0c;广告在投放之前也要认真地调查。由于广告实质是商家和消费者沟通的一个过程&#xff0c;所以在广告投放前&#xff0c;商家就应…

数据新生态:Web3如何重新定义个人数据权利

随着数字化时代的不断深入&#xff0c;个人数据已经成为了现代社会中最宝贵的资源之一。然而&#xff0c;传统互联网时代下&#xff0c;个人数据往往被大型科技公司垄断、滥用&#xff0c;个人数据权利常常受到侵犯。而随着Web3技术的崛起&#xff0c;人们开始期待一种全新的数…

zynq固化问题

zynq固化&#xff0c;sd卡如果没有用gpio那么这个地方不能选 另外ddr型号一定要选对&#xff0c;不同的容量不一样

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

React中常见的面试题

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 1. 约束性组件与非约束性组件 1.1. 非约束性组件 非约束性组件其实就是不能控制状态的组件,比如: <input type"text" defaultValue"123&qu…

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统&#xff1a;64位的CentOS 7或更新版本。内核版本&#xff1a;最低要求是3.10&#xff0c;推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

rk3568定时器

前言 本文记录的是用rk3568开发板做定时器实验 1 定时器理论知识 1.1系统节拍 在linux的kernel路径中,输入: make ARCH=arm64 menuconfig // 在内核路径下执行打开配置界面 选中“Timer frequency”,打开以后如图所示: 从图 14.1.1.1 可以看出,可选的系统节拍率为 100…

派派派森03

1.JSON数据 Python数据和Json数据的相互转化 # 导入json模块 import json#准备符合json格式要求的python数据 data [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]# 通过json.dump(data)方法把pyt…

黑龙江等保测评有哪些内容?

与等保1.0相比&#xff0c;新的等保2.0版本有了很大的变化&#xff0c;评估的内容、评估的标准也有了很大的差异。那么新版的《等保2.0》实施后&#xff0c;我们要测试什么&#xff1f; 等保测评首先是有十个大项&#xff0c;安全物理环境&#xff0c;安全区域边界&#xff0c;…

(echarts)图上数值显示单位

&#xff08;echarts&#xff09;图上数值显示单位 series: [{name: 比例,type: bar,...label: {show: true,position: top,formatter: (params) > params.value % //图上数值显示格式},tooltip: { //鼠标移入图上数值显示格式valueFormatter: function(value) {return val…

实现k8s网络互通

前言 不管是docker还是k8s都会在物理机组件虚拟局域网&#xff0c;只不过是它们实现的目标不同。 docker&#xff1a;针对同一个物理机&#xff08;宿主机&#xff09; k8s&#xff1a;针对的是多台物理机&#xff08;宿主机&#xff09; Docker 虚拟局域网 K8S虚拟局域网 …

借鉴与创新 台湾Apex齿轮减速机PII系列

台湾Apex Dynamics公司以其卓越的减速机技术&#xff0c;长期在全球机械传动领域占据着重要的地位。其中&#xff0c;齿轮减速机PII系列作为齿轮箱Apex基线的新成员&#xff0c;更是凭借其独特的性能和设计受到了广泛的应用。 APEX齿轮减速机PII系列在重量&#xff0c;尺寸&…

CANoe仿真工程Switch控件关联dbc信号出现的问题及解决思路

小白学习CANoe仿真&#xff0c;参考CANoe-第2个仿真工程-XVehicle—1总线数据库设计&#xff08;思路&#xff09;_canoe vehicle-CSDN博客 CANoe-第2个仿真工程-XVehicle1总线数据库设计&#xff08;操作&#xff09;_canoe factor 参数什么意思-CSDN博客CANoe-第2个仿真工程…

【计算机网络】对应用层HTTP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

多语言接入淘宝API抓取淘宝数据库数据获取详情页信息评论数据等,打造个性化营销策略

在数字化时代&#xff0c;个性化营销已成为品牌与消费者建立联系的关键。淘宝API作为强大的工具&#xff0c;能够帮助商家深入挖掘消费者需求&#xff0c;实现精准营销。本文将探讨如何通过淘宝API提升营销效果&#xff0c;增强用户体验。 消费者洞察&#xff1a; 淘宝API提供丰…

三.网络编程套接字_TCP

一.序言 在上一章中&#xff0c;我们已经实现了用udp来实现网络编程&#xff0c;这一节我们用tcp来实现网络编程&#xff0c;通过对比两者编写过程的区别&#xff0c;来加深对udp,tcp的理解&#xff01; (两者其实差别不大&#xff01;有了udp的基础&#xff0c;学习起来tcp会…

按摩师 | 打家劫舍 | 删除并获得点数 | 动态规划

1.按摩师&#xff08;打家劫舍 I&#xff09; 题目连接&#xff1a;面试题 17.16. 按摩师 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&am…

PyQt5学习系列之基础知识“字典”

PyQt5学习系列之基础知识——字典” 啰嗦字典使用字典取值与赋值其他使用 总结 啰嗦 在项目中使用到解析数据存放在字典中&#xff0c;对字典中的数据进行数据转化。即需要使用到字典&#xff0c;并对字典中的数据取值。 字典 一种可变容器模型存储任意类型对象每个键值对&am…