第一步:查找 minio 最新依赖,通过 maven 查询网站查询, 这搜索框输入 minio, 也可以查看 MinIO 官网 https://docs.min.io/docs/java-client-quickstart-guide.html如下:

33aa28be1761487e062b87213979524a.png

点击 minio 进入查看 maven 依赖,可以看到最新版为 8.3.4

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.4</version>
</dependency>

第二步:(整合到项目中)

1. 将依赖添加到新建的 springboot 项目中, 在 pom.xml 添加 2. 配置 minio 客户端, 不会的话参考 minio java sdk 文档, 但是这个文档给的是 3.0.10 版本的 sdk,与新版的不兼容,最新版的还是看 github 地址

参数说明
Endpoint对象存储服务的 URL
Access KeyAccess key 就像用户 ID,可以唯一标识你的账户
Secret KeySecret key 是你账户的密码

默认安装不指定 Access key 和 Secret key 的话都是 minioadmin, Endpoint 则为服务器地址:如我安装的的端口为 1024,那 Endpoint 就是: http://localhost:1024] 为了方便我们通过 bean 的方式注入客户端如下:

yml

spring:
  # 配置文件上传大小限制
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

# minio 参数配置
minio:
  endpoint: http://localhost:1024
  accessKey: minioadmin
  secretKey: minioadmin
@Configuration
public class MinIoClientConfig {

    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;

    /**
     * 注入minio 客户端
     * @return
     */
    @Bean
    public MinioClient minioClient(){

    return MinioClient.builder()
                        .endpoint(endpoint)
                        .credentials(accessKey, secretKey)
                        .build();
    }
}

ok, 现在客户端已注入 spring 容器中,在使用的时候,只需要获取就可以了。

第三步: 文件上传 1. 新增一个 UploadController 控制器用于处理文件上传,如下:

@RestController
public class UploadController {

    @Resource
    private MinioClient minioClient;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public String upload(MultipartFile file){

        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename())
                    .bucket("test")
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(),file.getSize(),-1).build();

            minioClient.putObject(objectArgs);
            return "ok";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }
}

注意这里的 bucket 是我提前在 minio 中新增好的,如果没有的话,可以自己手动添加,也可以通过代码添加, 具体参考 sdk 的说明, 这里就不多说了。

2. 通过 postman 测试文件上传(没有 postman 的可以看我之前的博客,有相关介绍)

358dd0b1913f34953c7c08c1971af735.png

点击执行后返回 ok, 执成功, 此时通过 minio web 端看看文件是否上传成功

81ae8805305e715b86c454dcb71e3883.png

看到刚上传的文件就说明成功了。3. 其他说明, 如何通过浏览器访问刚上传的图片呢,就是通过 endpoint 服务地址加 bucket 名称加图片的名称,在本例子访问路径则为:5b01ca40273bcf53f4e6d84c0c595642.gif

第四步: 文件下载

在 UploadController 控制其中新增 download 方法, 如下:

/**
     * 下载文件
     * @param filename
     */
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse res){

        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket("test")
                .object(filename).build();

        try (GetObjectResponse response = minioClient.getObject(objectArgs)){
            byte[] buf = new byte[1024];

            int len;

            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){

                while ((len=response.read(buf))!=-1){

                    os.write(buf,0,len);

                }
                os.flush();

                byte[] bytes = os.toByteArray();

                res.setCharacterEncoding("utf-8");
                res.setContentType("application/force-download");// 设置强制下载不打开
                res.addHeader("Content-Disposition", "attachment;fileName=" + filename);
                try ( ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

通过访问下载地址:http://localhost:8421/download/5b01ca40273bcf53f4e6d84c0c595642.gif, 文件下载下来能够正常显示,则说明成功。

总结: 通过以上操作,我们已经完成 springboot 与 minio 的整合,可以通过 minio sdk 实现文件上传与下载功能。当然还有其他 api 操作,我就不多介绍了,都是一个思路,调用传值就可以了,自己尝试一下,就能 get 到了。


作者:Archie_java

来源链接:

https://blog.csdn.net/qq_43842093/article/details/121873566

783f9a29ed53c647025d9a56d4b7fae7.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐