Minio容器化部署并整合SpringBoot

1、启动minio容器

powershell 复制代码
docker run  -p 9000:9000 -p 9090:9090 --name minio  -d --restart=always  -e MINIO_ACCESS_KEY=minio  -e MINIO_SECRET_KEY=minio  -v /usr/local/minio/data:/data  -v /usr/local/minio/config:/root/.minio   minio/minio server /data  --console-address ":9000" --address ":9090"
9000端口 控制台页面使用
9090端口 开发时上传下载使用的端口
MINIO_ACCESS_KEY=minio 控制台登录账号
MINIO_SECRET_KEY=minio 控制台登录密码

2、可视化页面

地址 http://ip+9000

账号 运行容器时的MINIO_ACCESS_KEY

密码 运行容器时的MINIO_SECRET_KEY

2.1 创建bucket


2.2 修改bucket权限策略


2.3 生成上传使用的鉴权账户

这个在整合SpringBoot中会使用到

3、整合SpringBoot

3.1 引入依赖

xml 复制代码
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.3</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
    <scope>compile</scope>
</dependency>

3.2 增加配置

yaml 复制代码
minio:
     host: http://192.168.31.71:9090
     access-key: admin
     secret-key: admin
     
java 复制代码
@Configuration
public class MinIoConfig {

    @Value(value = "${minio.host}")
    private String host;

    @Value(value = "${minio.access-key}")
    private String accessKey;

    @Value(value = "${minio.secret-key}")
    private String secretKey;

    @Bean
    public MinioClient minioClient()  {
        MinioClient minioClient = MinioClient.builder().credentials(accessKey, secretKey).endpoint(host).build();
        return minioClient;
    }
}

3.3 文件操作

java 复制代码
public interface MinIoUploadService {
    boolean uploadFileToMinIo(String bucket,String fileName,MultipartFile file);
    boolean createBucket(String bucketName);
}
java 复制代码
@Slf4j
@Service
public class MinIoUploadServiceImpl implements MinIoUploadService {

    @Autowired
    private MinioClient minioClient;



    /**
     * 上传到minio
     * @param bucket
     * @param fileName
     * @param inputStream
     * @throws Exception
     */
    @Override
    public boolean uploadFileToMinIo(String bucket,String fileName,InputStream inputStream) {
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(fileName)//文件名
                    .bucket(bucket)//桶名词  与minio创建的名词一致
                    //   fileInputStream.available() 表示一直有内容就会上传  -1 表示将所有的相关文件的内容都上传
                    .stream(inputStream, inputStream.available(), -1) //文件流
                    .build();
            minioClient.putObject(putObjectArgs);
            return true;
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return false;
    }
 	/**
     * 创建bucket
     * @param bucketName
     * @return
     */
    @Override
    public boolean createBucket(String bucketName){
        try {
            BucketExistsArgs bucket = BucketExistsArgs.builder().bucket(bucketName).build();
            if (!minioClient.bucketExists(bucket)) {
                MakeBucketArgs make = MakeBucketArgs.builder().bucket(bucketName).build();
                minioClient.makeBucket(make);
            }
            return true;
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return false;
    }
}
java 复制代码
@Slf4j
@Api(tags = "文件上传控制层")
@RestController
@RequestMapping("/upload")
public class UploadFileController {


    @Autowired
    private MinIoUploadService minIoUploadService;

    @PostMapping("/uploadFile")
    public Result uploadFile(@RequestBody MultipartFile file){
        minIoUploadService.uploadFileToMinIo("data", UUID.randomUUID().toString(),file);
        return Result.success();
    }

}

4、问题梳理

4.1 OkHttp 依赖问题

Unsupported OkHttp library found. Must use okhttp >= 4.8.1

解决方法

引入版本在4.8.1以上的okhttp依赖

xml 复制代码
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
    <scope>compile</scope>
</dependency>

4.2 访问不通Minio问题

io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 403

S3 API Request made to Console port. S3 Requests should be sent to API port.

解决方法

首先排查一下连接的地址以及账号密码,这里的地址主要是看一下端口号,搭建minio时会暴露两个端口,一个是操作页面的端口,一个是上传文件的端口,例如本文是通过docker搭建的,暴露了两个端口 9000和9090,其中9000是页面访问使用的,9090是我们文件上传使用的

其次排查一下账号密码,这里的账号密码不是指登录页面使用的,而是登陆后在Service Accounts中创建的

相关推荐
ping某33 分钟前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy38 分钟前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom1 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
唐青枫5 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
用户1474853079745 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1235 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3656 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马6 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261356 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
码事漫谈6 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端