当前位置: 首页 > news >正文

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记

Minio介绍

minio官网

  • MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由选择底层存储介质。

  • MinIO的主要特点包括:

1、高性能:MinIO基于GO语言编写,具有高速、轻量级、高并发等性能特点,还支持多线程和缓存等机制进行优化,可以快速地处理大规模数据。

2、可扩展性:MinIO采用分布式存储模式,支持水平扩展,通过增加节点数量来扩展存储容量和性能,支持自动数据迁移和负载均衡。

3、安全性:MinIO提供了多种安全策略,如访问控制列表(ACL)、服务端加密(SSE)、传输层安全性(TLS)等,可以保障数据安全和隐私。

4、兼容性:MinIO兼容AWS S3 API,还支持其他云服务提供商的API,比如GCP、Azure等,可以通过简单的配置实现互操作性。

5、简单易用:MinIO的部署和管理非常简单,只需要运行一个二进制包即可启动服务,同时提供了Web界面和命令行工具等方便的管理工具。

  • S3协议是Amazon Web Services (AWS) 提供的对象存储服务(Simple Storage Service)的API协议。它是一种 RESTful风格的Web服务接口,使用HTTP/HTTPS协议进行通信,支持多种编程语言和操作系统,并实现了数据的可靠存储、高扩展性以及良好的可用性。

Minio安装 (linux+docker)

//拉取镜像
docker pull quay.io/minio/minio// 创建数据存储目录
mkdir -p ~/minio/data// 创建minio
docker run -p 9001:9000 -p 9090:9090 --name minio --restart=always -v ~/minio/data:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=yourpassword." -d quay.io/minio/minio server /data --console-address ":9090"
  • 参数解析
  1. docker run 运行容器

    启动一个新的 Docker 容器,如果镜像不存在,会自动拉取。

  2. -p 9001:9000 -p 9090:9090(端口映射)
    • -p 9001:9000
    • 将容器内部的 9000 端口 映射到 宿主机的 9001 端口,9000 是 MinIO 的 API 访问端口。
    • 这意味着你可以通过 http://localhost:9001 访问 MinIO 的 API。
    • -p 9090:9090
    • 将 容器内部的 9090 端口 映射到 宿主机的 9090 端口,9090 是 MinIO 的 Web 管理控制台端口。
    • 你可以通过 http://localhost:9090 访问 MinIO 的管理界面。

  3. –name minio(容器名称)
    • --name minio 给该容器命名为 minio,这样之后可以通过 docker stop minio / docker start minio 来管理它,而不需要使用容器 ID。

  4. –restart=always(自动重启)
    • --restart=always 让容器 始终自动重启,包括:
    • Docker 进程重启后,容器也会自动重启。
    • 容器异常退出时,Docker 也会自动重启它。
    • 但如果你 手动停止容器 (docker stop minio),它不会重启。

  5. -v ~/minio/data:/data(数据持久化)
    • -v ~/minio/data:/data 挂载数据卷,把 宿主机 ~/minio/data 目录映射到 容器内 /data 目录:
    • 这样 MinIO 存储的数据不会随着容器删除而丢失。
    • ~/minio/data 目录存储 MinIO 内部的对象数据。

  6. -e “MINIO_ROOT_USER=admin”(环境变量)
    • -e 传递环境变量,设置 MinIO 的 管理员用户名 为 admin。

  7. -e “MINIO_ROOT_PASSWORD=yourpassword.”(环境变量)
    • 设定 MinIO 管理员密码 为 自己设置.。

  8. -d quay.io/minio/minio(后台运行 & 指定镜像)
    • -d 让容器 后台运行(detach mode)。
    • quay.io/minio/minio 指定 MinIO 官方镜像(托管在 quay.io,类似于 docker.io)。

  9. server /data --console-address “:9090”(启动 MinIO 服务器)
    • server /data 指定 MinIO 使用 /data 目录 作为存储路径(前面 -v ~/minio/data:/data 绑定的目录)。
    • --console-address “:9090” 设置 MinIO Web 管理控制台 监听 9090 端口。

登录并创建桶

1、登录

在这里插入图片描述

2、创建桶

在这里插入图片描述
在这里插入图片描述

3、设置权限

在这里插入图片描述
在这里插入图片描述

在springBoot中使用 后端

1、导入坐标
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>
2、controller
@RestController
@RequestMapping("/admin/system")
public class FileUploadController {@Autowiredprivate FileUploadService fileUploadService;@PostMapping("/upload")//MultipartFile file 这个名字要和前端的name对应上. 我用的是element plus 默认的名字就是filepublic Result<String> fileUpload(MultipartFile file){//最后返回的是文件minio文件预览的浏览器的路径, 给前端作回显用// 见下面的我标红的图像String fileUrl=fileUploadService.fileUpload(file);return Result.build(fileUrl, ResultCodeEnum.SUCCESS);}
}
  • 返回的fileUrl 就是我标红的路径, 就是文件上传到的真实地方,方便前端作回显示
    在这里插入图片描述
  • 如果你用的不是Element plus 作上传, 记得名字要匹配了. 这里都是属于SpringMVC的知识 , 变量的名字都一样不要 @RequestParm 注解也行
<form id="uploadForm"><input type="file" name="file"> <!-- 这里的 name="file" 要和 @RequestParam("file") 一致 --><button type="button" onclick="uploadFile()">上传</button>
</form>
3、service
@Service
public class FileUploadServiceImpl implements FileUploadService {//使用配置文件的方式读,minio的配置, 不硬编码@Autowiredprivate MinioProperties minioProperties;@Overridepublic String fileUpload(MultipartFile file) {String fileUrl= null;try {MinioClient  minioClient =MinioClient.builder().endpoint(minioProperties.getEndpointUrl())  // MinIO 服务器地址.credentials(minioProperties.getAccessKey(), //  账号minioProperties.getSecureKey()) //密码.build();// 不存在桶就创建boolean found =minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());
//                不能用下滑线连接,拼接访问路径会出错if (!found) {// 创建minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());}//创建日期文件夹//DataUtil 来自Hutool工具类库String path = DateUtil.format(new Date(), "yyyyMMdd");//生成随机文件名String uuid = UUID.randomUUID().toString().replaceAll("-", "");String fileName=path+'/'+uuid+file.getOriginalFilename();minioClient.putObject(PutObjectArgs.builder().bucket(minioProperties.getBucketName())  //桶名称.object(fileName)  //文件名// 采用的是已经知道文件大小的读     -1 表示 不限制分块大小(自动选择最佳方式).stream(file.getInputStream(), file.getSize(), -1)//设置 文件的 MIME 类型)//让 MinIO 知道如何处理和预览这个文件。.contentType(file.getContentType()).build());//手动拼接url,给前端,方便前端作回显示fileUrl = minioProperties.getEndpointUrl()+"/"+minioProperties.getBucketName()+'/'+fileName;} catch (Exception e) {e.printStackTrace();}//我们是在新增用户的时候给用户添加头像的,你给前端访问路径了, 前端会映射到头像(avator这个字段上), 一点击新增用户,直接就把这个url带到mysql中了, 所有这里就不用写mapper了return fileUrl;}
}
  • 其中 用到DataUtil工具类,需要导入hutool
<!--        生成验证码 ,日期时间等--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency>
4、 配置文件内容

在配置文件中添加Minio的相关配置

# 自定义配置
spzx:minio:# 别用https,如果你没有申请过ssl证书,就http就可以# 用户名和密码都是 在docker构建 minio的时候设置的endpointUrl: http://服务器ip:9000      accessKey: 你的用户名secreKey: 你设置的密码bucketName: 给桶起个名字
5、 MinioProperties读配置文件

将构建MinioClient所对应的参数定义到配置文件中,然后通过该实体类封装该配置文件中的内容.

@Data // 需要提供get方法
@ConfigurationProperties(prefix = "spzx.minio")
public class MinioProperties {
//和yml声明的属性保持一致private String endpointUrl;  // minio的urlprivate String accessKey;  //账号private String secureKey;// 密码private String bucketName; //桶的名字
}
  • 记得在启动类中 加上@EnableConfigurationProperties
@SpringBootApplication
@ComponentScan(basePackages = {"com.chen"})
// 让spring能扫到我们自己写的配置类
@EnableConfigurationProperties(value = {MinioProperties.class})
public class SpzxManagerApplication {public static void main(String[] args) {SpringApplication.run(SpzxManagerApplication.class,args);}
}

前端 vue

<template><el-form-item label="头像"><!--         element plus     默认上传的name就是file, 和你controller启的名字对应上 --><el-uploadclass="avatar-uploader"action="http://localhost:8501/admin/system/upload":show-file-list="false":headers="headers":on-success="loadSuccess"><img v-if="sysUser.avatar" :src="sysUser.avatar" class="avatar"/><el-icon v-else class="avatar-uploader-icon"><Plus/></el-icon></el-upload></el-form-item>
</template>	      
//定义用户数据模型
const defaultSysUserForm = {id: '',userName: "",password: "",name: "",phone: "",avatar: "",   // 操作用户的头像description: ""
}
const sysUser = ref(defaultSysUserForm)
//上传成功的回调函数
const loadSuccess = (response) => {//这里response 就是我们后端封装的 result对象//给响应式对象复制//loadSuccess(response) 是上传成功的回调函数// response.data 包含上传成功后的文件 URL(即头像地址)。// 这样 sysUser.value.avatar 就能保存 新头像的 URL,从而在前端显示最新上传的头像。sysUser.value.avatar = response.data
}

相关文章:

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器&#xff0c;支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发&#xff0c;拥有轻量级、高性能、易部署等特点&#xff0c;并且可以自由…...

Ubuntu系统上部署Node.js项目的完整流程

以下是在Ubuntu系统上部署Node.js项目的完整流程&#xff0c;分为系统初始化、环境配置、项目部署三个部分&#xff1a; 一、系统初始化 & 环境准备 bash # 1. 更新系统软件包 sudo apt update && sudo apt upgrade -y# 2. 安装基础工具 sudo apt install -y buil…...

DeepSeek效应初现:Grok-3补刀ChatGPT,OpenAI已在ICU?

嘿&#xff0c;技术小伙伴们&#xff01;今天咱们聊聊最近在AI界引发轰动的新闻——DeepSeek和xAI相继用R1和Grok-3证明了预训练Scaling Law并非OpenAI的护城河。这意味着什么呢&#xff1f;让我们一探究竟&#xff01; 开场白 首先&#xff0c;让我们看看最新的“全能冠军”…...

【知识】torchrun 与 torch.multiprocessing.spawn 的对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干&#xff0c;可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...

深入了解 K-Means 聚类算法:原理与应用

引言 在数据科学和机器学习的世界中&#xff0c;聚类是一项非常重要的技术&#xff0c;它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用&#xff0c;如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...

Rust ~ Collect

背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象&#xff0c;并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合&#xff1a; 先获取一个集合&#xff0c;对其调用 iter 方法&#x…...

C# 类型转换

C# 类型转换 引言 在C#编程语言中&#xff0c;类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作&#xff0c;特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换&#xff0c;包括隐式转换和显式转换&#xff0c;以及…...

[IP] DDR_FIFO(DDR3 用户FIFO接口)

IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口&#xff0c;用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改&#xff0c;即可使用&#xff01; 关于IP详细使用说明&#xff0c;参考IP datasheet&#xff01; 示…...

第三百七十二节 JavaFX教程 - JavaFX HTMLEditor

JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器&#xff0c;具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...

蓝桥杯试题:DFS回溯

一、题目要求 输入一个数组n&#xff0c;输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...

Lua | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...

每日一题——接雨水

接雨水问题详解 问题描述 给定一个非负整数数组 height&#xff0c;表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#…...

java常见面试01

为什么重写 equals 还要重写 hashcode &#x1f308; 核心原因&#xff1a; 当两个对象通过equals()判断为相等时&#xff0c;它们的hashCode()必须返回相同的整数值&#xff01;这是Java世界的交通规则哦~&#xff08;交警曼波敬礼.jpg&#xff09; &#x1f9e9; 具体场景…...

算法-二叉树篇27-把二叉搜索树转换为累加树

把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...

C语言:51单片机 基础知识

一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等&#xff0c;具有一定规模的微型计算机。 特点&#xff1a; 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...

olmOCR:使用VLM解析PDF

在PDF解析中&#xff0c;目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline&#xff0c;或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于&#xff0c;olmOCR使用…...

数据结构(初阶)(七)----树和二叉树(堆,堆排序)

八&#xff0c;树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀…...

图像分类项目1:基于卷积神经网络的动物图像分类

一、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;…...

Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行

1. 网络拓扑介绍&#xff08;不使用虚拟机直接跳到2&#xff09; 虚拟机&#xff1a;VMware 17 Pro&#xff0c;为本机开启桥接模式。 我的究极套娃网络&#xff1a;手机V2rayNG代理端口为10808&#xff0c;开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具&#xff0c;能够批量为视频或音频生成字幕&#xff0c;还支持批量将字幕翻译成其他语言。该工具具有跨平台性&#xff0c;无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...