代码编织梦想

第一步:新建项目起个响亮的项目名

官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式

所以我们起名myminio-spring-boot-starte

下方是我的文件目录

 第二步:导入pom依赖;

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

第三步:根据图上目录创建各自文件

MinioConfig

import com.file.service.FileStorageService;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Data
@Configuration
@EnableConfigurationProperties({MinIOConfigProperties.class})
//当引入FileStorageService接口时
@ConditionalOnClass(FileStorageService.class)
public class MinIOConfig {

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    @Bean
    public MinioClient buildMinioClient() {
        return MinioClient
                .builder()
                .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
                .endpoint(minIOConfigProperties.getEndpoint())
                .build();
    }
}

MinioconfigProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.io.Serializable;

@Data
@ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss
public class MinIOConfigProperties implements Serializable {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

FileStorageService

import java.io.InputStream;

/**
 * @author itheima
 */
public interface FileStorageService {

    /**
     * 上传文件
     * @param prefix  文件前缀
     */
    public String uploadFile(String prefix, String filename,InputStream inputStream);

    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    public void delete(String pathUrl);

    /**
     * 下载文件
     * @param pathUrl  文件全路径
     * @return
     *
     */
    public byte[]  downLoadFile(String pathUrl);

}

MinioFileStorageService

import com.file.service.FileStorageService;
import com.file.config.MinIOConfig;
import com.file.config.MinIOConfigProperties;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Import;
import org.springframework.util.StringUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@EnableConfigurationProperties(MinIOConfigProperties.class)
@Import(MinIOConfig.class)
public class MinIOFileStorageService implements FileStorageService {


    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    private final static String separator = "/";

    /**
     * @param dirPath
     * @param filename  yyyy/mm/dd/file.jpg
     * @return
     */
    public String builderFilePath(String dirPath,String filename) {
        StringBuilder stringBuilder = new StringBuilder(50);
        if(!StringUtils.isEmpty(dirPath)){
            stringBuilder.append(dirPath).append(separator);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String todayStr = sdf.format(new Date());
        stringBuilder.append(todayStr).append(separator);
        stringBuilder.append(filename);
        return stringBuilder.toString();
    }
    /**
     * 上传文件
     *
     * @param prefix      文件前缀
     * @param filename
     * @param inputStream
     */
    @Override
    public String uploadFile(String prefix, String filename, InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("application/octet-stream")
                    .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            ex.printStackTrace();
            throw new RuntimeException("上传文件失败");
        }
    }

    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    @Override
    public void delete(String pathUrl) {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        // 删除Objects
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (Exception e) {
            log.error("minio remove file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }
    }


    /**
     * 下载文件
     * @param pathUrl  文件全路径
     * @return  文件流
     *
     */
    @Override
    public byte[] downLoadFile(String pathUrl)  {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        InputStream inputStream = null;
        try {
            inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
        } catch (Exception e) {
            log.error("minio down file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while (true) {
            try {
                if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
            } catch (IOException e) {
                e.printStackTrace();
            }
            byteArrayOutputStream.write(buff, 0, rc);
        }
        return byteArrayOutputStream.toByteArray();
    }
}

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.file.service.impl.MinIOFileStorageService

 

最后把我们写的minio-starter放入项目中,在父pom文件中引用这个starter

在application.yml中配置minio属性

 

minio:
  accessKey: //账号
  secretKey: //密码
  bucket: //桶名
  endpoint: http://locahost:9000   //ip+端口
  readPath: http://locahost:9000   //ip+端口

 在自己controller中注入FileStorageService   编写自己的接口调用FileStorageService里的方法就可以了

    @Resource
    private FileStorageService FileService;


    /**
     * 文件上传到minio
     */
    @SneakyThrows
    @PostMapping("/uploadFileminio")
    public R testMinio(@RequestPart MultipartFile file) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String Str = sdf.format(new Date());
        String s = FileService.uploadFile("minio的文件夹名", Str+file.getOriginalFilename(), file.getInputStream());
        return R.ok(s);
    }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_66231801/article/details/127992242

手写springboot自动装配 , 自定义spring-boot-starter-minio_lambda丶雨辰的博客-爱代码爱编程

以MinIO的操作为例,将MinIO作为一个Bean对象,制作成start对象,通过导入该项目依赖的方式,完成MinIO的相关操作 一. 自定义spring-boot-starter-minIO 第一步: 新建 MinIOTemplate 接口,只关心要实现的方法,不关心具体的实现步骤,封装成一个接口类,到时候我们要使用依赖注入的时候,只需要

如何将minio封装为springboot-starter?_kingyyf24的博客-爱代码爱编程

如何将MinIO封装为SpringBoot-Starter? 1、需求分析 由于MinIo可能会在多个微服务中被调用,而原生的MinIo API使用需要进行端点、账号、密码等初始化,在每个微服务中都进行相同的初始化步骤显然会让代码显得冗余,由此我们想到可以将这些初始化的工作,及相应的上传、下载等业务进行封装。 我们可以将上述功能封装为一个工具类,或者

minio对象存储spring boot starter封装组件_kangaroo.的博客-爱代码爱编程

介绍 新封装了一个组件,是对官方minio-java sdk的一个简单封装,并提供了俩个方法,供前端直传文件使用。 Maven 源码已上传GitHub:https://github.com/kangaroo1122/m

计控实验(一)—— 数字滤波实验_阿健也会编程的博客-爱代码爱编程

太原理工大学计算机控制技术实验之数字滤波实验 数字滤波实验 实验原理实验内容实验线路图设计参考流程图 实验步骤及结果采样周期设计运行结果 思考题 实验原理 一般现场环境比较恶劣,干扰源比较多,消除和抑

为什么我的视频播放量上不去?_大 周 网 络的博客-爱代码爱编程

正在做自媒体视频的你有没有这个疑问:自己视频的播放量为什么一直上不去? 其实除了内容本身的质量外,还有很多外在因素,这些因素也很容易被新手们忽略,导致播放量一直上不去,收益自然也不会很高。 今天这期内容就来跟粉丝们分享一

【第四部分 | javascript 基础】1:js概述、变量及输入输出_graskli的博客-爱代码爱编程

目录 | 概述 | JS的书写位置 | 输入输出 | 变量 命名规范 基本使用 通过输入语句prompt把信息赋值给变量 | 数据类型 JS数据类型的特别 简单数据类型 简介 简单数据类型 Number 简单数据类型 String 简单数据类型 Boolean、Undefined、Null 获取类型 类型转换 |

行业分析| 智慧消防对讲_可视对讲行业分析-爱代码爱编程

消防工程关系国计民生,关系到每个公民的人身和财产安全,在每个场所的建设中,消防工程建设是必不可少的一个板块,包括消防应急通道建设和应急设备建设两个方面。其中消防系统设备建设主要分为九大系统的建设:消防水系统、火灾自动报警系统

app测试面试题汇总(基础篇、进阶篇)_云管理app 测试面试-爱代码爱编程

一、基础篇 1、请介绍一下,APP测试流程? APP测试流程与web测试流程类似,分为如下七个阶段: 1.根据需求说明书编写测试计划; 2.制定测试方案,主要是测试任务、测试人员和测试时间的分配; 3.测试准备,包