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

news2025/2/27 21:12:36

文章目录

  • 配置
    • 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;
    
        @Bean
        public MinioClient minioClient() {
            return MinioClient.builder()
                    .endpoint(endpoint)
                    .credentials(accessKey, secretKey)
                    .build();
        }
    }
    

功能实现

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

1. 文件上传

  1. controller层

    @RestController
    @RequestMapping("/file/")
    public class FileController {
    
        @Autowired
        private 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 {
        @Autowired
        private MinioClient minioClient;
    
        @Value("${minio.bucket}")
        private String bucketName;
    
        /**
         * 文件上传
         * @param file 需要上传的文件
         * @param fileName 文件在 minio 中存储的名称
         */
        @Override
        public 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 {
    
        @Autowired
        private 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 {
        @Autowired
        private MinioClient minioClient;
    
        @Value("${minio.bucket}")
        private String bucketName;
    
        @Override
        public 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提供好的方法类即可。

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

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

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

相关文章

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正式发布…

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;满足业务的实际需要。本文将带你了解其背…

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;其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…

Ubutu部署WordPress

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

BIO、NIO、AIO解析

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