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

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;
    
        @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提供好的方法类即可。

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

相关文章:

  • MySQL八股整理
  • Unity Dedicated Server 控制台 输出日志LOg 中文 乱码
  • docker的下载与使用(一)
  • 【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算
  • 在Anaconda的虚拟环境中安装R,并在vscode中使用
  • 【Linux】CentOS7停服之后配置yum镜像源
  • ‌Selenium三大等待方式详解
  • 【数据分析】4 商业数据分析技能模型总结
  • 捌拾- 量子态层析 以及 布洛赫球 (1)
  • Nmap使用指南
  • etcd 3.15 三节点集群管理指南
  • Unity TMPro显示中文字体
  • SOC-ATF 安全启动BL31流程分析(3)
  • 计算机毕业设计SpringBoot+Vue.js新闻推荐系统(源码+文档+PPT+讲解)
  • 【网络通信】数据集合集!
  • 双线服务器和单线服务器的不同之处
  • 【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField
  • Ecode前后端传值
  • 【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界
  • haclon固定相机位标定
  • 网站毕业设计答辩问题/谷歌推广方案
  • 河南省建设部官方网站/seo诊断服务
  • 厦门市工程建设项目网上办事大厅/关键词搜索优化
  • 公安网站建设素材/seo关键词快速排名前三位
  • 旅行社网站建设方案/在线培训系统平台
  • 电子商务官方网站建设/b站推广