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中创建的

相关推荐
寻星探路13 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌14 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
曹牧15 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX15 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了15 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法16 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72516 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎16 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄16 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment16 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端