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

相关推荐
dragoooon341 天前
[Linux——Lesson23.线程概念与控制:线程基础]
java·开发语言·jvm
带刺的坐椅1 天前
Solon Web 的“分身术”:单应用多端口监听,化身多重服务
java·web·solon·端口·单体多模块
装不满的克莱因瓶1 天前
【项目亮点】基于EasyExcel + 线程池解决POI文件导出时的内存溢出及超时问题
java·jvm·excel·线程池·async·虚拟机·easyexcel
Lisonseekpan1 天前
IntelliJ IDEA 快捷键全解析与高效使用指南
java·ide·后端·intellij-idea
Fantasydg1 天前
外卖项目 day01
java
SeaTunnel1 天前
结项报告完整版:Apache SeaTunnel 支持 Flink 引擎 Schema Evolution 功能
java·大数据·flink·开源·seatunnel
q***71851 天前
常见的 Spring 项目目录结构
java·后端·spring
元亓亓亓1 天前
考研408--操作系统--day4--进程同步&互斥&信息量机制
java·数据库·考研·操作系统·408
武子康1 天前
Java-169 Neo4j CQL 实战速查:字符串/聚合/关系与多跳查询
java·开发语言·数据库·python·sql·nosql·neo4j
q***23571 天前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea