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

相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet