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

MinIO整合SpringBoot实现文件上传、下载

文章目录

  • 配置
    • 1. 部署MinIO服务
    • 2. 整合SpringBoot
  • 功能实现
    • 1. 文件上传
    • 2. 文件下载
  • 总结

配置

1. 部署MinIO服务

这里以docker为例:

  1. 安装minio命令
    docker run -p 9000:9000 -p 9001:9001 \
    --name minio \
    -v /path/to/data:/data \
    -e "MINIO_ROOT_USER=minioadmin" \
    -e "MINIO_ROOT_PASSWORD=minioadmin" \
    minio/minio server /data --console-address ":9001"
    
    表示MinIO 的 API 服务默认运行在 9000 端口,并且映射到容器的9000端口
    MinIO 的控制台(Web UI)默认运行在 9001 端口。
    注意:服务器部署记得开放9000和9001端口。
  2. 登录MinIO的ui控制台“ip+端口号”
    得到如下界面,输入配置的用户名和密码,也就是docker run命令中的
    -e "MINIO_ROOT_USER=minioadmin" \
    -e "MINIO_ROOT_PASSWORD=minioadmin" \
    
    在这里插入图片描述

2. 整合SpringBoot

  1. maven依赖:
    <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.14</version>
    </dependency>
    
  2. application.yaml
    minio:endpoint: http://你部署minio服务的ip地址:9000 # MinIO 服务器地址access-key: minioadmin          # 访问密钥secret-key: minioadmin          # 秘密密钥bucket: test            # 默认存储桶名称
    
  3. MinIO配置类
    import io.minio.MinioClient;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
    }
    

功能实现

以为文件上传、下载为例:

1. 文件上传

  1. controller层

    @RestController
    @RequestMapping("/file/")
    public class FileController {@Autowiredprivate FileService fileService;/*** 文件上传* @param file* @param fileName*/@PostMapping("upload")public Result uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName){String msg = fileService.uploadFile(file, fileName);return Result.success(msg);}
    
  2. service层

    public interface FileService {String uploadFile(MultipartFile file, String fileName);
    }
    
    @Service
    public class FileServiceImpl implements FileService {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucket}")private String bucketName;/*** 文件上传* @param file 需要上传的文件* @param fileName 文件在 minio 中存储的名称*/@Overridepublic String uploadFile(MultipartFile file, String fileName) {try {//MultipartFile 转换为 InputStream,以便 MinIO 客户端可以读取文件内容InputStream inputStream = file.getInputStream();//将文件上传到 MinIO 服务器minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)//文件存储的存储桶名称.object(fileName).stream(inputStream, file.getSize(), -1)//文件大小, partSize设置为 -1,MinIO 会使用默认的分块大小(通常是 5MB)进行上传。.contentType(file.getContentType())//文件的 MIME 类型.build());}catch (Exception e){return "文件上传失败";}return "文件上传成功";}
    }
    
  3. 测试结果:
    在这里插入图片描述
    在ui界面中可以查看到上传的文件:
    在这里插入图片描述

2. 文件下载

  1. controller层:

    @RestController
    @RequestMapping("/file/")
    public class FileController {@Autowiredprivate FileService fileService;/*** 文件下载* @param fileName* @return*/@GetMapping("download/{fileName}")public Result downloadFile(@PathVariable String fileName, HttpServletResponse response) throws IOException {InputStream inputStream = fileService.downloadFile(fileName);response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; fileName" + fileName);IOUtils.copy(inputStream, response.getOutputStream());response.flushBuffer();return Result.success();}
    }
    
  2. service层:

    public interface FileService {InputStream downloadFile(String fileName);
    }
    
    @Service
    public class FileServiceImpl implements FileService {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucket}")private String bucketName;@Overridepublic InputStream downloadFile(String fileName) {//从 MinIO 对象存储中读取的数据InputStream inputStream = null;try {inputStream = minioClient.getObject(GetObjectArgs.builder().object(fileName)//文件名称.bucket(bucketName)//文件所在存储桶的位置.build());} catch (Exception e) {return null;}return inputStream;}
    
  3. 测试结果:
    便于测试,我这里下载方法是显示下载文件的内容,结果正确。
    在这里插入图片描述

总结

与MQ类似,需要先部署服务,也有相应的图形化界面便于查看。写好配置文件,使用MinIO提供好的方法类即可。

以上为个人学习分享,如有问题,欢迎指出:)

相关文章:

MinIO整合SpringBoot实现文件上传、下载

文章目录 配置1. 部署MinIO服务2. 整合SpringBoot 功能实现1. 文件上传2. 文件下载 总结 配置 1. 部署MinIO服务 这里以docker为例&#xff1a; 安装minio命令docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -v /path/to/data:/data \ -e "MINIO_ROOT_USERmin…...

【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

FreeRTOS(3)列表List

在 FreeRTOS 的源码中大量地使用了列表和列表项&#xff0c;因此想要深入学习 FreeRTOS&#xff0c;列表和列表项是必备的基础知识。这里所说的列表和列表项&#xff0c;是 FreeRTOS 源码中 List 和 List Item 的 直译&#xff0c;事实上&#xff0c; FreeRTOS 中的列表和列表项…...

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…...

Harmony开发笔记(未完成)

一、感想 作为一名拥有11年经验的Android开发者&#xff0c;我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变&#xff0c;没有一种技术能够让人依赖一辈子。去年初&#xff0c;我自学了鸿蒙系统&#xff0c;并顺利通过了鸿蒙官方的初级和高级认。…...

【Java面试】创建线程有哪几种方式

目录 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口和FutureTask 4.使用Executor框架&#xff08;线程池&#xff09; Java并发编程中不同接口和类之间的关系 总结 1.继承Thread类 优点&#xff1a; 简单直观。直接继承Thread类&#xff0c;可以方便地使用Threa…...

在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)

概述 本文将详细介绍如何在Linux环境下部署MTCNN模型进行人脸检测&#xff0c;并使用NCNN框架进行推理。 1. CMake的安装与配置 下载CMake源码 前往CMake官网下载&#xff0c;找到适合您系统的最新版本tar.gz文件链接&#xff0c;或者直接通过wget下载&#xff1a;CMake官方…...

AI数字人系统源码部署解决方案!!!

一、开场白 如今&#xff0c;科技的步伐越来越快&#xff0c;数字人已经从想象中走进了我们的现实生活。它们在娱乐、教育、医疗等多个领域大放异彩。了解数字人的代码开发技术&#xff0c;能让我们更好地理解其工作原理&#xff0c;为那些想在这一领域大展拳脚或者用数字人技…...

W803|联盛德|WM IoT SDK2.X测试|(1)开箱:开发板及说明

前几天关注的联盛德微电子新推出了WM IoT SDK2.X&#xff0c;正式发布后&#xff0c;邀请用户参加“免费试用&#xff0c;赢千元大礼”活动&#xff0c;填写信息&#xff0c;等待统一发送&#xff0c;很快收到了板子。 活动地址&#xff1a;联盛德微电子WM IoT SDK2.X正式发布…...

003 SpringBoot集成Kafka操作

4.SpringBoot集成Kafka 文章目录 4.SpringBoot集成Kafka1.入门示例2.yml完整配置3.关键配置注释说明1. 生产者优化参数2. 消费者可靠性配置3. 监听器高级特性4. 安全认证配置 4.配置验证方法5.不同场景配置模板场景1&#xff1a;高吞吐日志收集场景2&#xff1a;金融级事务消息…...

2.✨java练习1(熟悉“类”)

1. A B - AcWing题库 问题描述 输入两个整数&#xff0c;求这两个整数的和是多少。 输入格式 输入两个整数A,B&#xff0c;用空格隔开 输出格式 输出一个整数&#xff0c;表示这两个数的和 数据范围 0≤A,B≤1e8 C #include <iostream> // 包含标准输入输出库 using n…...

基本网络安全的实现

基本网络安全的实现 一 &#xff1a;AAA AAA 是Authentication&#xff0c;Authorization and Accounting&#xff08;认证、授权和计费&#xff09;的简 称&#xff0c;它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架&#xff0c; 它是对网络安全…...

快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速

快手静态部署托管服务&#xff08;KFX&#xff09;历经四年发展&#xff0c;经历了三个阶段&#xff0c;一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”&#xff0c;这一转变极大地提升了资源利用率和效率&#xff0c;满足业务的实际需要。本文将带你了解其背…...

登录逻辑结合redis

1. 用户登录 用户访问登录页面&#xff0c;输入用户名和密码&#xff0c;提交表单。 服务端验证用户名和密码&#xff1a; 如果验证成功&#xff0c;生成 ticket&#xff0c;并将 ticket 和用户 ID 存储在缓存中&#xff08;如 Redis&#xff09;。 将 ticket 放入 Cookie 中…...

Locale+Jackson导致Controller接口StackOverflowError异常解决

问题 由于参与的项目有出海需求&#xff0c;即需要给外国人使用&#xff0c;即&#xff1a;需要支持i18n&#xff08;Internationalization的缩写&#xff0c;共20个字母&#xff0c;除去首尾两个字母&#xff0c;中间有18个&#xff0c;故简称i18n&#xff09;。 本来是好的…...

安卓工控平板电脑在环境监测设备中的运用

安卓工控平板电脑在环境监测设备中的运用主要体现在以下几个方面&#xff1a; 一、耐用性与可靠性 安卓工控平板电脑通常具有坚固耐用的外壳设计&#xff0c;如铝合金面板和镀锌钢板箱体结构&#xff0c;能够抵抗高温、低温、湿度、震动等恶劣的工作环境。这种耐用性和可靠性…...

【洛谷排序算法】P1012拼数-详细讲解

洛谷 P1012 拼数这道题本身并非单纯考察某种经典排序算法&#xff08;如冒泡排序、选择排序、插入排序、快速排序、归并排序等&#xff09;的实现&#xff0c;而是在排序的基础上&#xff0c;自定义了排序的比较规则&#xff0c;属于自定义排序类型的题目。不过它借助了标准库中…...

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…...

java项目之基于ssm的图书馆书库管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的图书馆书库管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 该系统可以实现图书信息管理…...

使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注

在计算机视觉中&#xff0c;帧间差异检测&#xff08;frame differencing&#xff09;是一种常用的技术&#xff0c;用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中&#xff0c;我们将通过分析一个基于OpenCV的简单帧间差异…...

deepseek从入门到精通-第一篇.本地化部署

前言 自从22年年底开始&#xff0c;人工智能开始从实验室一下子走入了普通人的视野中&#xff0c;chatgpt像一颗石子投入水中&#xff0c;溅起了一波又一波的涟漪。我们都通过各种方式试用大预言模型和机器进行对话或者提问。随着大语言模型的出现&#xff0c;各个类型的大模型…...

2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码

一. 真菌生长优化算法&#xff08;FGO&#xff09; 真菌生长优化算法&#xff08;Fungal Growth Optimizer&#xff0c;FGO&#xff09;是一种新型的自然启发式元启发式算法&#xff0c;其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…...

一个行为类似标准库find算法的模板

函数需要两个模板类型参数&#xff0c;一个表示函数的迭代器参数&#xff0c;另一个表示值的类型。 代码 #include<iostream> #include<string> #include<vector> #include<list>using namespace std;template <typename IterType,typename T>…...

Ubutu部署WordPress

前言 什么是word press WordPress是一种使用PHP语言开发的建站系统&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设WordPress。它是一个开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;允许用户构建动态网站和博客。现在的WordPress已经强大到几乎可以…...

网络渗透作业

第一题&#xff1a;使用Xpath对Order by 语句进行布尔盲注 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml&quo…...

BIO、NIO、AIO解析

一、基础概念 1、IO的含义 IO&#xff0c;Input/Output&#xff0c;即输入/输出。从计算机结构来看&#xff0c;IO描述了计算机系统和外部设备之间通讯的过程。从应用程序角度来看&#xff0c;一个进程的地址空间划分为 用户空间&#xff08;User space&#xff09; 和 内核空…...

【Python网络爬虫笔记】14-使用代理绕过访问限制

【Python网络爬虫笔记】14-网络代理 目录什么是代理&#xff1f;为什么需要使用代理&#xff1f;代理的类型如何在Python中使用代理&#xff1f;使用requests库设置代理使用urllib库设置代理使用scrapy框架设置代理 典型案例&#xff1a;使用代理爬取豆瓣电影Top250步骤1&#…...

⭐算法OJ⭐位操作实战(C++ 实现)190. Reverse Bits | 268. Missing Number | 338. Counting Bits

文章目录 190. Reverse Bits逐位反转思路步骤代码复杂度分析 268. Missing Number338. Counting Bits动态规划 最低有效位思路步骤代码复杂度分析 动态规划 最后设置位思路步骤代码复杂度分析 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. 逐位反…...

Linux中Shell运行原理和权限(下)(4)

文章目录 前言一、Shell的运行原理二、Linux当中的权限问题Linux权限的概念如何将普通用户添加到信任列表 三、Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法如…...

Java中的缓存技术:Guava Cache vs Caffeine vs Redis

在Java中&#xff0c;缓存技术是提升应用性能的重要手段。常见的缓存技术包括Guava Cache、Caffeine和Redis。它们各有优缺点&#xff0c;适用于不同的场景。以下是对它们的详细对比&#xff1a; 1. Guava Cache 类型: 本地缓存 特点: 基于内存的缓存&#xff0c;适用于单机应…...